0
点赞
收藏
分享

微信扫一扫

GDB调试使用的命令

1、目前线上问题出现内存泄露, 怎样使用shell脚本 执行gdbattach 后 break bt quit等快速执行呢?

2、多进程 多线程一般会用到那些命令?

对于第一个问题:

以前文章有:​​gdb快速打印线程堆栈​​

 目前可以参考脚本:

 

set disassemble-next-line on:自动反汇编后面要执行的代码  
si:

maint info program-spaces:打印当前所有被调试的进程信息
用“display /i $pc” :命令显示当程序停止时,将要执行的汇编指令;取消显示可以用undisplay命令。
“disas /m fun”(disas是disassemble命令缩写)命令将函数代码和汇编指令映射起来
info line 13 只想查看某一行所对应的地址范围

set print elements number-of-elements--
set print elements 0
set print elements unlimited
打印大数组的内容,


p array[60]@10 打印了array数组第60~69个元素的值

set print array-indexes on 打印数组的索引下标
“set print pretty on”命令,这样每行只会显示结构体的一名成员,而且还会根据成员的定义层次进行缩进:

用“bt full”命令显示各个函数的局部变量值
info locals 只是想打印当前函数局部变量的值
想查看进程的内存映射信息,可以使用“info proc mappings”命令(i是info命令缩写)
可以用"i files"(还有一个同样作用的命令:“i target”)命令,它可以更详细地输出进程的内存信息,包括引用的动态链接库等等,
whatis xxx 或者 ptype xxx 打印变量的类型和所在文件
info variables xxx 查看定义该变量的文件:

gdb中使用“x”命令来打印内存的值,格式为“x/nfu addr”。含义为以f格式打印从addr开始的n个长度单元为u的内存值。参数具体含义如下:
a)n:输出单元的个数。
b)f:是输出格式。比如x是以16进制形式输出,o是以8进制形式输出,等等。
c)u:标明一个单元的长度。b是一个byte,h是两个byte(halfword),w是四个byte(word),g是八个byte(giant word)。
以16进制格式打印数组前a16个byte的值:(gdb) x/16xb a

可以显式地指定文件名(上下文):
(gdb) p 'static-1.c'::var
$1 = 1
(gdb) p 'static-2.c'::var
$2 = 2

list(简写为l)命令来显示源代码以及行号

使用“watch a”命令以后,当a的值变化:由0变成1,由1变成2,程序都会停下来。

此外也可以使用“watch *(data type*)address”这样的命令,
使用“watch expr thread threadnum”命令设置观察点只针对特定线程生效,也就是只有编号为threadnum的线程改变了变量的值,
程序才会停下来,其它编号线程改变变量的值不会让程序停住

可以使用“rwatch”命令设置读观察点,也就是当发生读取变量行为时,程序就会暂停住
使用“awatch”命令设置读写观察点,也就是当发生读取变量或改变变量值的行为时,




当gdb启动时,会读取HOME目录和当前目录下的的配置文件,执行里面的命令。这个文件通常为“.gdbinit”。
这里给出了本文档中介绍过的,可以放在“.gdbinit”中的一些配置:
# 打印STL容器中的内容
python
import sys
sys.path.insert(0, "/home/xmj/project/gcc-trunk/libstdc++-v3/python")
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

# 保存历史命令
set history filename ~/.gdb_history
set history save on

# 退出时不显示提示信息
set confirm off

# 按照派生类型打印对象
set print object on

# 打印数组的索引下标
set print array-indexes on

# 每行打印一个结构体成员
set print pretty on

 

 

对于第二个:

看以前问题文章

​​GDB使用​​    GDB符号表

进程:

​​gdb catch功能​​

set follow-fork-mode child
catch exec

​​Catch Point​​真是个好东西,支持很多有用的事件:

  • 常规的C++异常事件
  • 系统调用事件(可直接指定系统调用号)
  • 动态库的加载/卸载事件
  • exec/fork/vfork

2.2 set detach-on-fork on
      只调试父进程或子进程的其中一个(根据follow-fork-mode来决定),这是默认的模式。

 

2.3 set detach-on-fork off
       父子进程都在gdb的控制之下,其中一个进程正常调试(根据follow-fork-mode来决定),另一个进程会被设置为暂停状态。

 

1.2 set follow-fork-mode parent
      gdb只跟踪父进程,不跟踪子进程,这是默认的模式。

 

1.3 set follow-fork-mode child
      gdb在子进程产生以后只跟踪子进程,放弃对父进程的跟踪。

 

 如果想让父子进程都同时运行,可以使用“​​set schedule-multiple on​​”

show follow-fork-mode
set follow-fork-mode child
show detach-on-fork
set detach-on-fork off

 

  gdb调试多进程时,如果想要在进程间进行切换,那么就需要在fork调用前设置: set detach-on-fork off ,
然后使用 info inferiors 来查看进程信息,得到的信息可以看到最前面有一个进程编号,使用 inferior num 来进行进程切换。
那么为什么要使用 set detache-on-fork off 呢?它的意思是在调用fork后相关进程的运行行为是怎么样的,是detache on/off ?
也就是说分离出去独立运行,不受gdb控制还是不分离,被阻塞住。这里还涉及到一个设置 set follow-fork-mode [parents/child] ,
就是fork之后,gdb的控制落在谁身上,如果是父进程,那么分离的就是子进程,反之亦然。如果detache-on-fork被off了,
那么未受控的那个进程就会被阻塞住,进程状态为T,即处于调试状态。

r

运行调试

display

显示变量追踪

n

下一步

watch

监控变量,当变量发生修改时,打印显示。删除对应监控变量,

可以先 info watch,然后 delete 对应的号码。

c

继续运行

info registers / register <reg>

查看寄存器

ctrl + c

中断信号

info win


窗口切换fs cmd   fs src

c/continue

中断后继续运行

display

追踪查看具体变量值。

s

进入一个函数

undisplay

取消追踪观察变量。

finish

退出函数

i watch

显示观察点。

l

列出代码行

thread apply all bt

显示线程所有堆栈

b

断点

显示断点列表 info b

删除断点 delete

清除断点 clear

info threads

查看多个线程

until

跳至行号

until number

thread <thread id>

调试某个线程。

p

打印

打印数组信息 p *array@len

p/x 按十六进制格式显示变量

attach

绑定进程调试

attach -p pid

bt/backtrace

堆栈bt <-n>

-n表一个负整数,表示只打印栈底下n层的栈信息。

detach

取消绑定调试进程

f/frame

进入指定堆栈层

f number

disassemble

看二进制数据

disassemble func

x

查看内存

focus

显示源码界面

查看源代码

  • list(l):查看最近十行源码
  • list fun:查看fun函数源代码
  • list file:fun:查看flie文件中的fun函数源代码

设置断点与观察断点

  • break 行号/fun设置断点。
  • break file:行号/fun设置断点。
  • break if<condition>:条件成立时程序停住。
  • info break(缩写:i b):查看断点。
  • watch expr:一旦expr值发生改变,程序停住。
  • delete n:删除断点。

多线程下:

thread apply ID1 ID2 IDN command:让线程编号是ID1,ID2…等等的线程都执行command命令。

thread apply all command:所有线程都执行command命令。

set scheduler-locking off|on|step:在调式某一个线程时,其他线程是否执行。在使用step或continue命令调试当前被调试线程的时候,其他线程也是同时执行的,如果我们只想要被调试的线程执行,而其他线程停止等待,那就要锁定要调试的线程,只让他运行。
off:不锁定任何线程,默认值。
on:锁定其他线程,只有当前线程执行。

step:在step(单步)时,只有被调试线程运行。

set non-stop on/off:当调式一个线程时,其他线程是否运行。

set pagination on/off:在使用backtrace时,在分页时是否停止。

set target-async on/ff:同步和异步。同步,gdb在输出提示符之前等待程序报告一些线程已经终止的信息。而异步的则是直接返回。

show scheduler-locking:查看当前锁定线程的模式

 

 

 

 


http代理服务器(3-4-7层代理)-网络事件库公共组件、内核kernel驱动 摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!! 但行好事 莫问前程 --身高体重180的胖子



举报

相关推荐

0 条评论