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
设置汇编指令格式:
在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”。
设置观察点只针对特定线程生效
gdb可以使用“watch expr thread threadnum
”命令设置观察点只针对特定线程生效,也就是只有编号为threadnum
的线程改变了变量的值,程序才会停下来,其它编号线程改变变量的值不会让程序停住
PS:
gdb可以使用“rwatch
”命令设置读观察点,也就是当发生读取变量行为时,程序就会暂停住
gdb可以使用“awatch
”命令设置读写观察点,也就是当发生读取变量或改变变量值的行为时,程序就会暂停
如果想在调试一个线程时,让其它线程暂停执行,可以使用“set scheduler-locking on
”命令: