Linux可以查看调用堆栈的信息,但是需要更改Linux设置,使程序崩溃时候产生core文件。然后可以用gdb调试。
1.产生core文件方法
产生coredump文件的条件,首先需要确认当前会话的ulimit –c,若为0,则不会产生对应的coredump文件,需要进行修改和设置。
ulimit -c unlimited (可以产生coredump文件且不受大小限制),这种设置仅对当前生效,如果想永久生效
那么需要在
/etc/profile中加入以下一行,这将允许生成coredump文件
ulimit-c unlimited
2.更改core dump生成路径
因为core dump默认会生成在程序的工作目录,但是有些程序存在切换目录的情况,导致core dump生成的路径没有规律,
所以最好是自己建立一个文件夹,存放生成的core文件。
我建立一个 /data/coredump 文件夹,在根目录data里的coredump文件夹。
调用如下命令
echo /data/coredump/core.%e.%p> /proc/sys/kernel/core_pattern
将更改core文件生成路径,自动放在这个/data/coredump文件夹里。
%e表示程序名, %p表示进程id
3. 如何应用及调试步骤
(1)无论你是用Makefile来编译,还是直接在命令行手工输入命令来编译,都应该加上 -g 选项。
(2)一般来说,在默认情况下,在程序崩溃时,core文件是不生成的(很多Linux发行版在默认时禁止生成核心文件)。所以,你必须修改这个默认选项,在命令行执行:
ulimit -c unlimited
表示不限制生成的core文件的大小。
(3)运行你的程序,不管用什么方法,使之重现Segmentation Fault错误。
(4)这时,你会发现在你程序同一目录下,生成了一个文件名为 core.*** 的文件,即核心文件。例如,“core.12345”这样的文件。
(5)用GDB调试它。假设你的可执行程序名为testcrash,则在命令行执行:
gdb test core.12345
(6)会显示一些堆栈信息,之后再(gdb)后输入bt,就可以查看crash点了。
如:
。。。。
。。。。
#2(anonymous namespace)::TimerManagerLinux::process (this=0x24ae840, registration=...) at /home/buildbot/src/nena/nacm/timer/src/TimerManager_linux.cpp:222
#3 0x759542cc in na::comm::LocalProxy<na::iface::mgr::system::timer::TimerMgr>::TriggerSignIn<na::iface::mgr::system::timer::TimerMgr::TimerStatus, na::iface::mgr::system::timer::TimerMgr::TimerArgument>::operator() (process=<optimized out>, this=<optimized out>) at /home/buildbot/src/nena/nacl/include/comm/LocalProxy.hpp:384