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”命令(iinfo命令缩写)显示函数堆栈帧信 

可以用“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 

设置汇编指令格式:

在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”命令:

posted @ 2021-05-20 18:39  codestacklinuxer  阅读(788)  评论(0编辑  收藏  举报