编译时加-g选项,如:
cc -g hello.c -o hello
g++ hw.cpp -g -o hw
gdb在线参考:http://sourceware.org/gdb/current/onlinedocs/gdb/
启动GDB的方法有以下几种:
1、gdb <program>
program也就是你的执行文件,一般在当前目录下。
2、gdb <program> core
用gdb同时调试一个运行程序和core文件(core dump后产生的文件)。
3、gdb <program> <PID>
如果你的程序是后台程序,那么你可以指定这个程序运行时的进程ID。gdb会自动attach上去,并调试他。
4、gdb attach pid (注意, 没有拉取新的进程)设置断点:
break 10
break test.c:10
break main
break 行号 if 条件
开始运行
start
跳转到断点
continue
c
run
r
我们也可以用watch命令来观察变量,如果变量的值发生变化,程序就会停止
watch b
删除断点
delete 行号
退出gdb
quit
查看断点信息
info b
backtrace(或bt) 查看各级函数调用及参数
finish 连续运行到当前函数返回为止,然后停下来等待命令
frame(或f) 帧编号 选择栈帧
info(或i) locals 查看当前栈帧局部变量的值
list(或l) 列出源代码,接着上次的位置往下列,每次列10行
list 行号 列出从第几行开始的源代码
list 函数名 列出某个函数的源代码
next(或n) 执行下一行语句
print(或p) 打印表达式的值,通过表达式可以修改变量的值或者调用函数
quit(或q) 退出gdb调试环境
set var 修改变量的值
start 开始执行程序,停在main函数第一行语句前面等待命令
step(或s) 执行下一行语句,如果有函数调用则进入到函数中
-------------------------------------------------------------------------------------
实际工作中cordump时必不可少的:
开:当前终端生效:
ulimit -c unlimited 来开启 core dump 功能,并且不限制 core dump 文件的大小; 如果需要限制文件的大小,将 unlimited 改成你想生成 core 文件最大的大小,注意单位为 blocks(KB)。
查:查看当前是否已经打开了此开关
通过命令:ulimit -c 如果输出为 0,则代表没有打开。如果为unlimited则已经打开了,就没必要在做打开。
取消:ulimit -c 0 就可以了
永久生效:
1.可以修改文件/etc/bash.bashrc文件,添加一行ulimit -c unlimited,然后执行命令source /etc/bash.bashrc生效。此时通过ulimit -a查看:
2.命令加入/etc/profile文件
source /etc/profile
/etc/profile :这个文件是每个用户登录时都会运行的环境变量设置,属于系统级别的环境变量,设置在里面的东西对所有用户适用。
source命令也称为“点命令”也就是一个点符号(.)。
可选:
还可以通过修改/proc/sys/kernel/core_pattern 来控制生成 core 文件保存的位置以及文件名格式。
调试:
GDB中键入bt,就会看到程序崩溃时堆栈信息(当前函数之前的所有已调用函数的列表(包括当前函数)),注意编译时的-g选项
----------------------------------------
GDB堆栈跟踪的方法,来自:https://blog.csdn.net/hejinjing_tom_com/article/details/9472041
----------------------------------------
程序“调用堆栈”是当前函数之前的所有已调用函数的列表(包括当前函数)。每个函数及其变量都被分配了一个“帧”,
最近调用的函数在 0 号帧中(“底部”帧)。要打印堆栈,发出命令 'bt'('backtrace' [回溯] 的缩写):
(gdb) bt
#0 0x80483ea in wib (no1=8, no2=8) at eg1.c:7
#1 0x8048435 in main (argc=1, argv=0xbffff9c4) at eg1.c:21
此结果显示了在 main() 的第 21 行中调用了函数 wib()(只要使用 'list 21' 就能证实这一点),而且 wib() 在 0 号帧中,
main() 在 1 号帧中。由于 wib() 在 0 号帧中,那么它就是执行程序时发生算术错误的函数。
实际上,发出 'info locals' 命令时,gdb 会打印出当前帧中的局部变量,缺省情况下,这个帧中的函数就是被中断的函数(0 号帧)。
可以使用命令 'frame' 打印当前帧。要查看 main 函数(在 1 号帧中)中的变量,可以发出 'frame 1' 切换到 1 号帧,
然后发出 'info locals' 命令:
(gdb) frame 1
#1 0x8048435 in main (argc=1, argv=0xbffff9c4) at eg1.c:21
21 result = wib(value, div);
(gdb) info locals
value = 8
div = 8
result = 4
i = 2
total = 6