zoukankan      html  css  js  c++  java
  • 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”命令:

    http代理服务器(3-4-7层代理)-网络事件库公共组件、内核kernel驱动 摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!! 但行好事 莫问前程 --身高体重180的胖子
  • 相关阅读:
    字典或者数组与JSON串之间的转换
    银联支付 支付代码
    iOS 一个新方法:- (void)makeObjectsPerformSelector:(SEL)aSelector;
    iOS 直接使用16进制颜色
    iOS 添加view的分类(更加方便的设置view的位置)
    iOS 中UITableView的深理解
    Swift 中调试状态下打印日志
    手把手教React Native实战开发视频教程【更新到40集啦。。。】
    React Native 开发
    React-Native学习指南
  • 原文地址:https://www.cnblogs.com/codestack/p/14785820.html
Copyright © 2011-2022 走看看