gdb调试技巧
Gdb调试技巧
1, 添加调试信息
g++ -g test.cpp –o test
2, 常用命令
显示图形化代码 Ctrl+x+a
启动程序 r (run)
断点 b (breakpoint)
清除/禁用/启用断点 delete/disable/enable
单步 s (step 碰到函数会进入)
单行 n (next 碰到函数不会进行, 而是整条执行)
执行到下一个断点 c (continue)
查看变量 p (print)
显示完整的长字符串:set print element 0
显示变量 display
查看当前调用堆栈 bt (backtrace)
查看某一层调用代码 f (frame)
3, 调试core dump
程序执行时,经常会因为段错误segment fault而退出,操作系统会把此程序当前内存信息dump到磁盘上,即生成core文件,对core进行分析可以很快分析出导致程序crash的地方
3.1,设置core文件大小
系统默认不会生成core文件,需要进一步设置。core文件的生成依赖于shell的设置,在shell中运行命令:ulimit –a,可以查看系统的默认设置。使用命令ulimit –c unlimited 可以设置core file size 为无限。
永久设置coredump的方法:
sudo vim /etc/security/limits.conf
文件最后增加如下两行
@username soft core unlimited
@username hard core unlimited
永久设置coredump文件路径及其文件名称的方法
sudo vim /etc/sysctl.conf
文件最后增加如下两行
kernel.core_pattern = /opt/tercel/core_log/core_%e_%t_%p
kernel.core_uses_pid = 0
使用命令sudo sysctl –p使得修改生效
3.2,生成core文件
3.3,调试简单core文件
使用gdb ./test core来调试core,发现gdb直接就定位到了出错的语句。
3.4,使用breaktrace 和frame命令
4, 利用gdb调试找出nginx崩溃的方法
1, 使用命令:ulimit –a检查core file设置的是否正确,见前面说明;
2, 将nginx源码目录文件auto/cc/conf中的一行“ngx_compile_opt=“-c””更改为“ngx_compile_opt=”-c -g””
3, 在nginx源码目录下执行sudo ./configure命令
4, 编译nginx源码,将objs目录下的nginx文件复制到nginx运行目录,此步切记不要make install,否则会覆盖nginx.conf
5, 重启nginx,等待core.*****文件生成
6, gdb加载coredump文件:gdb –core=core.****
7, gdb>where 就很容易找到nginx segfault的原因了
5, gdb加载nginx运行中的work进程
1, ps –ef|grep nginx查看当前nginx运行进程;
2, sudo gdb进入gdb调试环境;
3, attach pid(进程id);
4, break ****命令设置断点;
5, c命令运行到断点位置开始单步调试