GDB 功能
- 在程序启动之前指定一些可以影响程序行为的变量或条件。
- 在某个指定的地方或条件下暂停程序,在程序停止时检查已经发生了什么。
调试信息与调试原理
- 一般要调试某个程序,为了能清晰地看到调试的每一行代码、调用的堆栈信息、变
量名和函数名等信息,需要调试程序含有调试符号信息。 - 使用
gcc
编译程序时,如果加上-g
选项即可在编译后的程序中保留调试符号信息。g++ -g -o hello_gdb hello_gdb.cpp
启动 GDB 调试
直接调试目标程序
gdb ./hello_gdb
附加进程
- 在某些情况下,一个程序已经启动了,我们想调试这个程序,但是又不想重启这个程序,比如调试
Redis
。 - 当使用
gdb attach
上目标进程后,目标进程会暂停下来,可以使用continue
让目标程序继续运行。 - 当调试完目标程序并且想结束此次调试,同时不对目标程序有任何影响,使用
detach
。
ps -ef | grep redis # 得到 pid = 1294
# root 1294 1 0 May14 ? 00:10:36 redis-server 127.0.0.1:6379
gdb attach 1294
detach
# 退出 gdb 调试
quit
调试 core 文件
- 有时候服务器在程序运行一段时间后会突然崩溃。
- 只要程序在崩溃的时候有
core
文件产生,就可以使用这个core
文件来定位崩溃的原因。 linux
系统默认不开启程序崩溃产生core
文件这一机制,我们可以使用ulimit -a
命令来查看系统是否开启了这一机制。root@hecs-94806:~/holo_render/test# ulimit -a core file size (blocks, -c) 0 ...
- 发现
core file size
那一行默认是0
,表示关闭生成core
文件。可以修改为不限制大小。ulimit -c unlimited root@hecs-94806:~/holo_render/test# ulimit -a core file size (blocks, -c) unlimited ...
- 测试:
gdb test_core core
常用命令