首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Linux上获得错误段核心转储

这可能是由于: 试图解引用指针(你不被允许访问内存地址 0);◈ 试图解引用其他一些不在你内存(LCTT 译注:指不在合法内存地址区间内)指针;◈ 一个已被破坏并且指向错误地方 C++ 虚表指针...从 gdb 得到堆栈调用序列 你可以像这样用 gdb 打开一个核心转储文件: 1. $ gdb -c my_core_file 接下来,我们想知道程序崩溃时堆栈是什么。... gdb 提示符下运行 bt 会给你一个调用序列(backtrace)。例子里,gdb 没有为二进制文件加载符号信息,所以这些函数名就像 “??????”。...一旦我这样做了,当我执行 bt 时,gdb 给了我一个带有行号漂亮堆栈跟踪! 如果你想它能工作,二进制文件应该以带有调试符号信息方式被编译。...试图找出程序崩溃原因时,堆栈跟踪行号非常有帮助。:) 查看每个线程堆栈 通过以下方式 gdb 获取每个线程调用栈!

4K20

Linux调试工具

比如,linux,共享库里所有static函数/全局变量都是export,更糟是C语言中没有名字空间这个概念,导致函数名极易冲突。多个共享库,名字冲突引起BUG是比较难查。...:strace 功能: 1、显示用户空间程序发出系统调用 2、显示调用参数和返回值 【5】 名称gdb 功能: 1、启动程序 2、使程序能够停止指定文件指定位置...默认情况下,它只打印目标文件初始化和可加载段可打印字符;对于其它类型文件 它打印整个文件可打印字符,这个程序对于了解文本文件内容很有帮助。...bdwgc 也可以用来检测 C 或者 C++ 程序漏洞。旧版垃圾收集器包括...更多bdwgc信息 libdwarf 可以 ELF 对象文件读或者写 DWARF 调试信息。...bdwgc 也可以用来检测 C 或者 C++ 程序漏洞。旧版垃圾收集器包括...更多bdwgc信息 libdwarf 可以 ELF 对象文件读或者写 DWARF 调试信息。

9.8K43
您找到你想要的搜索结果了吗?
是的
没有找到

C++雾中风景番外篇3:GDB与Valgrind ,调试代码内存工具

笔者 入"坑"C++之后,调试 C++代码过程之中,学习了不少调试代码内存工具。...1.利用 GDB 调试 CoreDump CoreDump时一个二进制文件,进程发生错误崩溃时,内核会产生一个瞬时快照,记录该进程内存、运行堆栈状态等信息保存在core文件之中。...图片.png 利用 GDB 调试 core 文件 调试 core 文件需要利用原生编译出二进制文件调试。...这里有一点需要注意,如果编译 C++文件之时没有加-g编译选项,core 文件调试内容会不够完整。笔者这里建议开启对应编译选项,这会导致对应二进制文件变大,编译时间变长。...(生产环境可以考虑关闭)使用gdb 二进制文件 core 文件打开 core 文件。 ? 利用 gdb 调试 core 文件 core 文件列出了两个线程信息。

2.1K31

GDB调试

编译时候加上-g参数,编译器就会在目标文件添加调试信息(关于编译链接可参阅《从四个问题透析Linux下C++编译&链接》),对应strip命令可以去除调试信息。...回车GDB相当于重复上一个命令。 启动GDB运行程序 运行GDB调试a.out程序有以下几种方式方式一:直接运行gdb,然后gdb执行“file a.out”加载程序。...方式五:对运行a.out,可以先按方式二启动,然后gdb中心“attach 19475”调试运行a.out 进入到GDB后,可以通过help命令来获取帮助,GDB对命令做了分类,要获取详细说明可以查看...打印数组: print *pArr@10:pArr是指向数组指针,10表示要打印元素个数 通过“::”打印文件函数或者C++变量: print main::value 打印内存: x [...问题四:全局符号介入 《从四个问题透析Linux下C++编译&链接》中提到全局符号介入,这种问题通常会引起core dump,要定位相关问题需要对代码执行路径有一定了解,通过GDB反馈的当前帧符号来源来定位符号是否来自预期

2.1K10

如果一定要在 C++ 和 Java 中选择,是选 C++ 还是 Java ?

在有继承关系体系,父构造函数和析构函数一定要申明为 virtual 吗?如果不申明为 virtual 会怎样? 什么是 C++ 多态?C++ 多态实现原理是什么? 什么是虚函数?...虚函数实现原理是什么? 什么是虚表?虚表内存结构布局如何?虚表第一项(第二项)是什么? 菱形继承( D 同时继承 B 和 C,B 和 C 又继承自 A)体系下,虚表各个布局如何?...掌握了汇编,你可以理解函数调用是如何实现,你可以理解函数几种调用方法,为什么printf这样函数调用方式不能是 __stdcall,而必须是 __cdecl。...作为一个开发者,要清楚地知道我们写 C/C++ 程序是如何通过预处理、编译与链接等步骤最终变成可执行二进制文件,操作系统如何识别一个文件为可执行文件,一个可执行文件包含什么内容,执行时如何加载到进程地址空间...我推荐一种方式是,使用 gdb 或者 Visual Studio 调试器将你需要学习多线程程序中断下来,多线程面板,看看这个进程一共有多少个正在运行线程,分析每个线程作用,然后研究下这些线程何时何地创建

3.4K30

Linux基础——Linux开发工具()_gccg++

函数函数库一般分为静态库和动态库两种: 静态库是指编译链接时,把库文件代码全部加入到可执行文件,因此生成文件比较大,但在运行时也 就不再需要库文件了。...Linux调试器-gdb使用 首先了解一下程序发布方式: 程序发布方式有两种,debug模式和release模式 Linux gcc/g++出来二进制程序,默认是release模式 debug...版本:程序本身会加入调试信息,可以进行调试 release版本:不会添加任何调试信息,是能调试 要使用gdb调试,必须在源代码生成二进制程序时候, 加上 -g 选项 因为debug版本下,会加入调试信息...我们想进入gdb模式,我们可以: 指令:gdb 文件名 我们想退出gdb模式,我们可以: 指令:ctrl + d quit 下面给大家介绍一下常用gdb指令: 调试: rrun:...运行程序 n next:单条执行 sstep:进入函数调用 until X行号:跳至X行 finish:执行到当前函数返回,然后挺下来等待命令 continuec:运行到下一个断点处

12910

GDB入门教程之如何使用GDB启动调试

GDB (The GNU Project Debugger)是 Linux 系统下调试 C 和 C++ 程序主要神兵。本文介绍多种方式下使用 GDB 启动进程调试方法和命令。...要使得 C 和 C++ 程序能在 GDB 下正常进行调试,必须在程序编译期间把基本调试信息(如变量名、函数名、函数调用堆栈等)添加到可执行文件。...当使用GDB加载不包含调试信息二进制文件进程时,GDB终端会提示错误信息:"no debugging symbols found"。...一、GDB调试未执行程序 对于本地某个二进制文件 demo ( GDB 也支持远程调试),若其启动时不需要命令行参数,则可以shell下使用命令 gdb demo 进入 GDB,并输入 run (缩写形式...三、GDB调试core文件 当程序 Linux 系统下发生异常崩溃(如段错误)时,内核会将该应用程序崩溃发生时内存数据、程序调用堆栈等核心信息转存到磁盘,这种功能称之为 core dump,中文可翻译为

4.1K10

在生产环境中使用 eBPF 调试 GO 程序

观察状态一种简单方法是使用调试器来捕获函数参数。对于 Go 程序来说,我们经常使用 Delve 或者 GDB开发环境,Delve 和 GDB 工作得很好,但是在生产环境并不经常使用它们。...为了更好地捕获函数参数,我们将探索使用 eBPF( Linux 4.x+ 可用)以及高级 Go 程序库 gobpf。 eBPF 是什么?...从功能上讲,eBPF 允许你某些事件(例如定时器,网络事件函数调用)触发时运行受限 C 代码。...除非删除了调试数据,否则即使优化过二进制文件也可以找到这些信息。...另外,因为这一过程工作二进制层面,它也可以用于其他语言(C++,Rust 等)编译二进制文件。我们只需考虑它们各自 ABI 差异。 下一步是什么

1.5K10

第 1 部分: 在生产环境中使用 eBPF 调试 Go 程序

开发环境, Delve 和 GDB 工作得很好, 但是在生产环境并不经常使用它们. 那些使调试器强大特性也让它们不适合在生产环境中使用....为了更好地捕获函数参数, 我们将探索使用 eBPF( Linux 4.x+ 可用) 以及高级 Go 程序库 gobpf. eBPF 是什么 ?...这些保证使 eBPF 可以用于性能关键工作负载, 例如数据包过滤, 网络监控等. 从功能上讲, eBPF 允许你某些事件(例如定时器, 网络事件函数调用)触发时运行受限 C 代码....除非删除了调试数据, 否则即使优化过二进制文件也可以找到这些信息....另外, 因为这一过程工作二进制层面, 它也可以用于其他语言(C++, Rust 等)编译二进制文件. 我们只需考虑它们各自 ABI 差异. 下一步是什么 ?

1.3K11

Android基础开发实践:如何分析Native Crash

Linux对信号定义signum.h文件: ? 4.2 FaultManager 除了SignalCatcher,Runtime启动时候会创建一个FaultManager, ?...Android上使用gdb编译不是一件轻松事情,但是也并不复杂。Android SDK实际上已经包含了一套gdb调试工具,我们直接拿来使用即可。...不过还是不建议日常调试过程启用这类插件,避免丢掉有效信息。...如果是因为加载so或者link so导致问题,本人实现了几个脚本,可以方便地获取到so文件之间依赖关系(便于确定加载so顺序),以及从大量so查找特定符号或者Java 名。...总结 Android上Native Crash总的来说还是有章可循,通过分析有效日志和调用栈以及使用正确工具进行调试,也可以达到和Java Crash差不多分析效率。

17.1K153

linux后台开发常用调试工具

检查内存错误 三、其他 proc文件系统 系统日志 一、编译阶段 nm(获取二进制文件里面包含符号) 符号:函数、变量 参数: -C 把C++函数签名转为可读形式...默认状态下调试符号不会被列出) -l 列出符号源代码对应行号(指定这个参数后,nm将利用调试信息找出文件名以及符号行号。...对于一个已定义符号,将会找出这个符号定义行号,对于未定义符号,显示为) -n 根据符号地址来排序(默认是按符号名称字母顺序排序) -u 只列出未定义符号...strip(去除二进制文件里面包含符号) 用途: 可执行程序减肥(通常只已经调试和测试过生成模块上,因为不能调试了) 反编译、反跟踪 readelf(显示目标文件详细信息) nm...参数: -a 显示函数文件行号前显示地址 -b 指定二进制文件格式 -C 解析C++符号为用户级名称,可指定解析样式 -e 指定二进制文件

3.8K151

【Linux】Linux 编译器与调试器 -- gccg++gdb 使用

# test.c:我们要编译代码 # test.i 预处理产生文件一般以.i为后缀 # -o test.i:用于指明临时文件名称(test.i),它会将预处理之后代码保存到指明临时文件,而不是直接打印到终端上...---- 2、链接方式函数库 2.1 动态链接与静态链接 我们在编写代码时候,除了自己实现函数之外,我们还会去调用函数代码,比如 scanf/printf/malloc/fopen;但是我们要明白...,库代码是别人给我们写好供我们直接使用,即我们只有该函数调用,而没有函数实现; 同时,程序预处理、编译和汇编阶段处理都是我们自己编写代码,只有链接时候,库函数实现才会和我们代码关联起来...程序一共有两种链接方式:动态链接与静态链接; 动态链接是指执行代码时,如果遇到库函数调用就跳转到动态库对应函数定义处,然后执行该函数,执行完毕后再跳转回原程序并继续往下执行;它优点是形成可执行程序小...、程序内部包含有关调试二进制信息,还是 gdb 模式下是否具有调试样例都是有明显区别的。

1.6K00

C++面试知识总结

动态内存泄露检测:检查new/delete资源是否正确释放,检查程序运行期间内存是否一直增长,使用内存检测工具来检测泄露情况。...链接阶段:例如,某个源文件函数可能引用了另一个源文件定义某个函数程序可能调用了某个库文件函数。 1.5 预编译 定义:预编译又称为预处理 , 是做些代码文本替换工作。...通过头文件可以来调用函数。因为有些代码不能向用户公布,只要向用户提供头文件二进制库即可。用户只需要按照头文件接口声明来调用库功能,编译器会从库中提取相应代码。...如果某个接口被实现被使用时,其方式与头文件声明不一致,编译器就会指出错误,这一简单规则能大大减轻程序员调试、改错负担。 2....  3.8 析构函数特点 函数名称固定:~名( ) 没有返回类型,没有参数 不可以重载,一般由系统自动调用 3.8 公有继承、私有继承、受保护继承 公有继承时,派生对象可以访问基公有成员

1.7K41

Linux后台开发必看(给进军bat你)

c/c++软件开发 拿到offer 这是小蓝整理Linux后台开发面试高频题目(除了语言部分,其他部分差别应该不大),并提供相关知识书籍视频资源。...三 相关知识点汇总 1 c/c++相关 c++函数原理 智能指针 c语言如何实现c++对象以及私有成员 c++多态实现 new和malloc区别以及底层实现原理 STLvector怎么扩容 虚函数指针初始化过程...c++11原子变量介绍 c++11特性有哪些,说用过 怎么理解重载与重写 怎么理解c++static关键字 vector和list 区别 c++内存分配 map与set底层实现 静态变量初始化...tcpdump top makefile介绍下(cmake介绍下) gdb查看堆栈中所有遍历 gdb查看shared_ptr指向内容 gdb如何调试多进程多线程 g++和gcc编译出来有什么区别...死锁怎么调试 core文件是什么gdb调试core文件 如何读取一个10G文件,cat一个10g文件会发生什么 Linux基础命令推荐书籍:《Linux就该这么学》 Linux应用编程推荐书籍《

1.6K20

学习GDB

2 生成调试信息      一般来说GDB主要调试是C/C++程序。要调试C/C++程序,首先在编译时,我们必须要把调试信息加到可执行文件。...     进入指定函数时停住:      C++可以使用class::functionfunction(type,type)格式来指定函数名。...函数入口处停住      break class::functionfunction(type,type) -- classfunction函数入口处停住      break namespace...::class::function -- 名称空间为namespaceclassfunction函数入口处停住 5.3 查询所有断点      info b 6条件断点      一般来说,为断点设置一个条件...12 显示源代码      GDB 可以打印出所调试程序源代码,当然,程序编译时一定要加上 –g 参数,把源程序信息编译到执行文件。不然就看不到源程序了。

1.5K80

后台开发:核心技术与应用实践 -- 编译与调试

/可执行文件 gdb gdb是gcc 调试工具,主要用于 C和C++ 这两种语言编写程序。...C和C++ 程序,首先在编译时,必须要把调试信息加到可执行文件。...产生 coredump 文件一些原因: 内存访问越界 多线程程序,使用了线程不安全函数 多线程读写数据未加锁保护 非法指针,包括使用指针随意使用指针转换 堆横溢出 Linux ps (...例如,声明函数中一个局部变量 int b; 系统自动为b开辟空间 堆:需要程序员自己申请,并指明大小,C中用 malloc 函数 C++ 中用 new 运算符 申请后系统响应不同 栈...栈:函数调用时,第一个进栈是主函数下一条指令( 函数调用语句下一条可执行语句)地址,然后是函数各个参数,大多数C编译器,参数是由右往左入栈,然后是函数局部变量。

74110

吃土记之GDB调试原理

执行信号处理函数。 你知道 redis 通过 fork 管道 信号SIGCHLD方式完成持久化。 你知道valgrind通过侵式方式机器码层接管程序,通过跟踪汇编汇总寄存器 栈 来进程内存泄漏。...启动注入代码方式检查死锁 然后这些东西不会融会贯通 吃土记录 像外行一样思考,像专家一样实践: 小王:遇到core怎么办? 老王:gdb调试呀 小王:gdb 为什么可以侵入调试进程呀。...使用gdb调试程序时,程序进程状态是”T”,但又似乎并非接到了SIGSTOP信号, 那么这个”T”是什么呢?...data:根据不同指令 二、gdb使用ptrace基本流程 gdb调试一个新进程:通过fork函数创建一个新进程,子进程执行ptrace(PTRACE_TRACEME, 0, 0, 0)函数,然后通过...使用参数为PTRACE_TRACEMEPTRACE_ATTACHptrace系统调用建立调试关系之后,交付给 目标程序任何信号(除SIGKILL之外)都将被gdb先行截获,gdb因此有机会对信号进行相应处

99320

Linux从入门到精通(九)——Linux编程

插入方式:当用户需要输入文本时,使用某个命令,进入插入方式,才可开始输入文本。 末行方式命令方式中键入:就进入末行方式末行方式输入命令,例如W(写)和回车,就可将编辑内容存入文件。...命令方式,用两个ZZ (大写) 可以退出vi 。 末行方式用qq !,还可以用wq 。 2....只编译汇编不链接,生成目标文件.o-S只编译不链接,生成汇编代码-E只进行预处理,不做其他处理-g可执行程序包含标准调试信息,加了这个才可以gdb调试文件。...6.1 gdb 基本用法 ​ 需要调试程序,在编译时要使用调试选项。默认情况下,调试符号不会编译到程序调试之后,不需要重新编译程序。...gdb [可执行文件名] 出现 (gdb)#这里可以输入调试命令 注意:可执行文件编译时候,必须加入参数-g,才可以使用gdb 6.2 gdb 常用命令 进入gdb调试界面后,可以输入以下命令:

2K30

GDB调试还不会?看这篇就够了!

源码查看 Linux使用C/C++进行开发,不了解gdb基本使用,是有点说不过去,网上也有官方GDB教程,或者其他教程,本文是借助实例,介绍了如何使用GDB进行调试。...本文以C程序为例,介绍GDB启动调试多种方式。 哪程序可被调试 对于C程序来说,需要在编译时加上-g参数,保留调试信息,否则不能使用GDB进行调试。...根据函数名设置断点 同样可以将断点设置函数处: b printNum 程序调用到printNum函数时候会断住。...'::b $2 = {1, 2, 3, 5} (gdb) 这里所打印a值是我们定义testGdb.h文件,而b值是main函数b。...:5 #编辑test.c第五行 可自行尝试,这里location和前面介绍一样,可以跟指定文件特定行指定文件指定函数

4.2K21

Linux后台开发必看!

三 相关知识点汇总 1 c/c++相关 c++函数原理 智能指针 c语言如何实现c++对象以及私有成员 c++多态实现 new和malloc区别以及底层实现原理 STLvector怎么扩容 虚函数指针初始化过程...c++11原子变量介绍 c++11特性有哪些,说用过 怎么理解重载与重写 怎么理解c++static关键字 vector和list 区别 c++内存分配 map与set底层实现 静态变量初始化...proc文件系统 自旋锁与普通锁区别 虚拟内存 进程内存分布 栈内存为什么由系统自动分配和释放 守护进程如何创建 进程间通信方式及其区别,应用场景 死锁条件和解除 进程调度方式 对编译连接理解...tcpdump top makefile介绍下(cmake介绍下) gdb查看堆栈中所有遍历 gdb查看shared_ptr 指向内容 gdb如何调试多进程多线程 g++和gcc编译出来有什么区别...死锁怎么调试 core文件是什么gdb调试core文件 如何读取一个10G文件,cat一个10g文件会发生什么 Linux基础命令推荐书籍:《Linux就该这么学》 Linux应用编程推荐书籍:《后台开发核心技术与应用实践

3.3K40
领券