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调试

  参考

  

  

  

  

原文地址:https://www.cnblogs.com/abnk/p/13596107.html