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命令运行到断点位置开始单步调试

posted @ 2018-01-03 14:54  哼哼哈哈二将  阅读(892)  评论(0编辑  收藏  举报