gdb调试多进程和多线程

进程

    (1)默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB支持多进程的分别以及同时调试,也就是说,GDB可以同时调试多个程序。只需要设置follow-fork-mode和detach-on-fork即可。

    设置方法:a)启动gdb;b)set follow-fork-mode [parent|child]   set detach-on-fork [on|off];c)启动程序文件;d)break fork 在fork函数处下断点。

    (2)attach子进程的方法:用attach <pid>命令attach到子进程然后调试。步骤是:a)首先在需要调试的子进程的初始代码中加入一段特殊的代码,然后运行调试程序;b)用ps -ef | grep 查看产生的子进程的pid;c)启动gdb,attach到进程之后就可以调试了。

      ./test & 在后台执行程序

      运行gdb

      (gdb)attach <pid>

      (gdb)stop 暂停子进程

    下断点后就可以开始调试了

 

线程

 

    在多线程编程时,当我们需要调试时,有时需要控制某些线程停在断点,有些线程继续执行。有时需要控制线程的运行顺序。有时需要中断某个线程,切换到其他线程。这些都可以通过gdb实现。

      gdb test 

      (gdb)l 1 显示代码

      (gdb)r 5    r 16在第五行、第十六行下断点

      (gdb)r 开始运行

      (gdb)thread 3 切换到线程3

 

gdb调试指令

    list  linenum      显示程序第linenum行周围的程序

    list  function      显示函数名为function的函数的源程序

    step count         一次性执行count步,如果有函数会进入函数

    next count         一次执行count步,有函数也不会进人

    finish                 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值以及参数信息

    until                   退出循环体

    watch   expr                 为表达式expr设置一个观察点,一旦表达式值有变化,马上停住程序

    rwatch  expr                  当表达式expr被读时,停住程序

    awatch expr                  当表达式的值被读或被写时,停住程序

    info      watchpoints       列出所有观察点

多线程调试:
     info threads                                       显示所有线程
    thread id                                            切换到指定线程
    break filename:linenum thread all     在所有线程相应行设置断点,注意如果主线程不会执行到该行,并且启动all-stop模式,主线程执行n或s会切换过去
    set scheduler-locking off|on\step       默认off,执行s或c其它线程也同步执行。on,只有当前相称执行。step,只有当前线程执行
    show scheduler-locking                     显示当前模式
    thread apply all command                 每个线程执行同意命令
 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值