zoukankan      html  css  js  c++  java
  • GDB

    1.

      很好的文章:参考    官方参考(官方)  脚本调试        很好的pdf

      一些使用技巧    动态库查找

      参考    单步调试

      脚本的写法:参考

      脚本调试:

    # 方法一: 在gdb的interactive界面运行 source mycmd.gdb
    (gdb) file test.exe 
    (gdb) source mycmd.gdb 
    
    # 方法二: 在命令行中运行 gdb 的 batch 模式命令
    gdb --batch --command=cmd.gdb --args test.exe <add necessary parameters here> 
    
    # 方法三:
    sudo gdb -p "$(pidof my-app)" -batch \
    -ex "set logging on" \
    -ex continue \
    -ex "bt full" \
    -ex quit
    
    # 方法四:
    #!/bin/sh
    gdb app <<GDB_INPUT
    pwd
    run X a b c
    quit
    GDB_INPUT
    
    
    
    # 原文链接:https://blog.csdn.net/nirendao/article/details/105910753
    # https://qastack.cn/programming/10748501/what-are-the-best-ways-to-automate-a-gdb-debugging-session
    # http://62.234.115.194/ask/100322110.html

      

      ctrl + x + a 切换gdb的TUI

      编译的时候如果用了-o2/o3,看调用栈的时候就会有一些问题。

      ulimit -c unlimited,生成core文件;然后主机使用xxx-linux-gdb ./test ./core。

      gdb三种调试方式:gdb ./exec     gdb attach pid       gdb ./exec ./corefile

      atach的方式用于调试正在运行中的程序。attach 会打断进程运行。

      detach 输入以后即可解除 attach 让程序继续运行。

      运行程序的时候如果发生了core dump才会产生core dump文件。只有特定的信号集才能产生core dump。

      /etc/profile里面加 ulimit -c unlimit 就可以解除core dump文件大小的限制。

      配置core dump文件生成目录:

    vim /etc/sysctl.conf
    kernel.core_pattern=$HOME/core_dump/core-%e-%p-%t 对应自己要存放的目录
    %e是当前目录名+PID+时间

      退出:ctrl + b 或者 q

      set 命令设置参数,如果有空格,要用双引号包住。

      show args 显示所有参数。

      run [arg]    简记为 r

      bt 显示栈帧,输入 f 7,切到对应的 #7 的地方,l 列出这个地方的代码段。bt + f 可以一层一层的去看调用栈。

      b filename:line   打断点。

      b ClassName::funcname 不加参数,打断点。

      c 继续。

      n 单步执行。

      s, step命令可以进入到函数里面。

      info命令:参考     常用:info b显示打了哪些断点。

      list:查看代码,简记 l, l 然后 b line 就可以一行一行的调试。然后 c、bt 等查看更多信息,一行一行的调试。l -20

      strip ./exec      去掉因为加-g参数产生的调试符号,可以看见文件变小了。

      直接输入delete可以删除所有的断点。

      finish 命令执行当前函数直到正常退出该函数。

      return 直接结束当前正在运行的函数。一般都用finish正常结束函数,退到上一层进来的地方。

      p xxx 即print, 打印变量,结构体指针要加*号解引用去看。

      u line 即 until,运行到某行再停下来。

      jump:做测试比较多。jump 8,jump12。如果跳不过去就是没条件执行。

      tbreak main,设置临时断点,即gdb退出以后再进来,断点就不在了。

      watch,看变量变化,变量变了之后就会停下来。

      display,也是看变量的。每一次都会打出变量。配合delete display xxx、info display xxx。

    多线程:

      info threads:显示所有线程信息。显示很多线程时,main函数所在就是主线程。

      线程切换:thread 2

    调试时锁住线程:set scheduler-locking on。 一般都是切到某个线程并锁住。c 继续。set scheduler-locking off 关闭锁。作用就是调试的时候不在各个线程里面乱窜。关于lock,在gdb里面有更详细的讲解。

      info args 可以显示该函数的所有参数。

    多进程:

      set fllow-fork mode,设置当一个进程fork出子进程的时候调试哪个,防止乱窜。如,把命令的 mode 改成 child。

        

      学nginx的时候就可以学attach怎么处理。

    常用命令:

      

      

      list显示出的大小还可以修改。set listsize 20

      list 10,100  显示该范围内的。

      

      

    chrome使用gdb调试

      参考

      

      

      

      

  • 相关阅读:
    IDEA导入外部jar包步骤
    将本地新建工程推到git上
    【转】Memcached与Redis有什么区别
    Redis
    JavaScript-Tool-lhgDialog-js:lhgdialog.js
    信息安全-HTTP:HTTP 身份验证
    信息安全-HTTP:HTTP访问控制(CORS)
    JavaScript-Tool-lhgDialog:框架示例
    JavaScript-Tool-lhgDialog:动画示例-源代码
    JavaScript-Tool-lhgDialog:动画示例
  • 原文地址:https://www.cnblogs.com/abnk/p/13596107.html
Copyright © 2011-2022 走看看