安装
sudo apt install gdb -y
cat >> ~/.bashrc << E
alias gdb='gdb -q'
E
cat >> ~/.gdbinit << E
set confirm off
E
基础命令
r:开始运行程序,直到断点; r xx xx传参;c继续,直到断点
n:单步调试,不会进入函数内部; s会进入函数内部
p:看变量或表达式的值,如 p name, p strlen(name);p a=5 改变变量值
b xx.cpp:6,给第6行打断点;i b :查看断点情况; d 1 删除断点号(i b查看)
fin:跳出函数; u:跳出循环
bt:查看堆栈,查看运行到哪一行
watch a: 设置观察点,当a发生变化,就打印,并停止运行;
i watchpoints:查看所有观察点;d 1:删除观察点
i locals:查看函数内所有变量值
tb:临时断点,命中一次就去除
ctrl+c:暂停程序
ptype i:查看i的类型
return -1: 结束后面的语句直接返回指定值
l: 查看代码
调试正在运行的程序
./a.out 启动程序
再开一个窗口:gdb -p $(pgrep a.out)
程序就会暂停,bt查看堆栈看程序停在哪里
调试完后,使用detach,即可关闭gdb,程序继续运行
调试多进程
set follow-fork-mode [parent(默认)|child] 选择调试父进程/子进程
set detach-on-fork [on|off] 运行所有进程/只运行当前进程
i inferiors 查看调试进程, inferiors 1 切换到1进程
调试多线程
i threads 查看所有线程, thread 2 切换到2线程
set scheduler-locking on(只运行当前线程)|off(运行所有线程)
调试core文件
core文件是的程序崩溃时内存状态dump出来的文件。就是车祸现场的快照。
- 准备工作:
ulimit -c unlimited
sudo /sbin/sysctl -w kernel.core_pattern=./core
- 生成-g版本,示例:
void foo() {
int *p = nullptr;
*p = 42;
}
int main() {
foo();
return 0;
}
g++ 1.cpp -g
./a.out
Segmentation fault (core dumped)
core文件已生成,进入:
gdb a.out core.681007
如图:
Reading symbols from a.out...
[New LWP 681007]
warning: Section `.reg-xstate/681007' in core file too small.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./a.out'.
Program terminated with signal SIGSEGV, Segmentation fault.
warning: Section `.reg-xstate/681007' in core file too small.
#0 0x000055857980f13d in foo () at 1.cpp:3
3 *p = 42;
它会停在崩溃处,一般后续:
bt 查看堆栈
i locals 查看所有局部变量
p val 查看某个变量
或者打断点,让他重跑