0
点赞
收藏
分享

微信扫一扫

gdb 打印每个线程的bt ps 状态等命令

for i in `ps -AL |grep Worker | awk '{print $2}'`; do \
echo === $i ===; \
gdb --q --n --ex bt --batch --pid $i; \
done 2>&1 |tee /var/stacks.txt

CPU使用率较低但负载较高

​ps -axjf​​命令查看是否存在 D+ 状态进程,该状态是指不可中断的睡眠状态。处于该状态的进程无法终止,也无法自行退出。只能通过恢复其依赖的资源或者重启系统来解决。

ps -axjf

 

  • ​top -c 然后按P,获取CPU使用率最高的进程​
  • top -H  按照 线程名称显示
  • top -H -p pid  显示某pid的所有线程

 GDB 加载运行的进程

# 用法 xgdb.sh a 
prog_bin=$1
running_name=$(basename $prog_bin)
pid=$(/sbin/pidof $running_name)
gdb attach $pid

 

使用gdb调试程序时,可以使用“​​i frame​​​”命令(​​i​​​是​​info​​命令缩写)显示函数堆栈帧信 

可以用“disas /m fun”(disas是disassemble命令缩写)命令将函数代码和汇编指令映射起来

如果只想查看某一行所对应的地址范围,可以:

(gdb) i line 13
Line 13 of "foo.c" starts at address 0x4004e9 <main+37> and ends at 0x40050c <main+72>.

 

如果只想查看这一条语句对应的汇编代码,可以使用“​​disassemble [Start],[End]​​”命令

使用gdb调试汇编程序时,可以用“​​display /i $pc​​”命令显示当程序停止时,将要执行的汇编指令

在gdb中,可以使用如下命令查看变量的类型:  ​​whatis xx  ​​​​ptype xx  ​​​​i variables xx​

用gdb调试程序时,可以用下面的自定义命令,打印程序动态分配内存的信息: 主要是使用gdb的define 作用

​​https://wizardforcel.gitbooks.io/100-gdb-tips/content/print-malloc-memory.html​​

define mallocinfo
set $__f = fopen("/dev/tty", "w")
call malloc_info(0, $__f)
call fclose($__f)
end
以上面程序为例:

Temporary breakpoint 5, main () at a.c:7
7 int i = 0;
(gdb) mallocinfo

设置汇编指令格式:

gdb 打印每个线程的bt    ps 状态等命令_gdb调试gdb 打印每个线程的bt    ps 状态等命令_gdb调试_02

在Intel x86处理器上,gdb默认显示汇编指令格式是AT&T格式。例如:

(gdb) disassemble main
Dump of assembler code for function main:
0x08050c0f <+0>: push %ebp
0x08050c10 <+1>: mov %esp,%ebp
0x08050c12 <+3>: call 0x8050c00 <change_var>
0x08050c17 <+8>: mov $0x0,%eax
0x08050c1c <+13>: pop %ebp
0x08050c1d <+14>: ret
End of assembler dump.
可以用“set disassembly-flavor”命令将格式改为intel格式:

(gdb) set disassembly-flavor intel
(gdb) disassemble main
Dump of assembler code for function main:
0x08050c0f <+0>: push ebp
0x08050c10 <+1>: mov ebp,esp
0x08050c12 <+3>: call 0x8050c00 <change_var>
0x08050c17 <+8>: mov eax,0x0
0x08050c1c <+13>: pop ebp
0x08050c1d <+14>: ret
End of assembler dump.
目前“set disassembly-flavor”命令只能用在Intel x86处理器上,并且取值只有“intel”和“att”。

View Code

设置观察点只针对特定线程生效

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

PS:

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

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

 

 如果想在调试一个线程时,让其它线程暂停执行,可以使用“​​set scheduler-locking on​​”命令:

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

举报

相关推荐

0 条评论