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的胖子