zoukankan      html  css  js  c++  java
  • 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命令运行到断点位置开始单步调试

  • 相关阅读:
    Windows XP中万能断点
    c#运算符 ?
    转神秘的程序员
    经典解决“线程间操作无效
    文件上传
    dowload.aspx
    mail
    js 正则
    新年快乐
    DataTable Compute
  • 原文地址:https://www.cnblogs.com/snowbook/p/8183757.html
Copyright © 2011-2022 走看看