zoukankan      html  css  js  c++  java
  • 多线程调试之痛 GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断

    摘自:https://www.cnblogs.com/lzpong/p/5881380.html

    调试器(如VS2008和老版GDB)往往只支持all-stop模式,调试多线程程序时,如果某个线程断在一个断点上,你的调试器会让整个程序freeze,直到你continue这个线程,程序中的其他线程才会继续运行。这个限制使得被调试的程序不能够像真实环境中那样运行--当某个线程断在一个断点上,让其他线程并行运行。

    GDBv7.0引入的non-stop模式使得这个问题迎刃而解。在这个模式下,

    • 当某个或多个线程断在一个断点上,其他线程仍会并行运行
    • 你可以选择某个被断的线程,并让它继续运行 

    让我们想象一下,有了这个功能后

    • 当其他线程断在断点上时,程序里的定时器线程可以正常的运行了,从而避免不必要得超时 
    • 当其他线程断在断点上时,程序里的watchdog线程可以正常的运行了,从而避免嵌入式硬件以为系统崩溃而重启
    • 可以控制多个线程运行的顺序,从而重现deadlock场景了。由于GDB可以用python脚本驱动调试,理论上可以对程序在不同的线程运行顺序下进行自动化测试。

    因此,non-stop模式理所当然成为多线程调试“必杀技”。这2009年下半年之后发布的Linux版本里都带有GDBv7.0之后的版本。很好奇,不知道VS2010里是不是也支持类似的调试模式了。

    1. 前提
      gdb -v 查看版本信息
      7.0以前不支持non-stop模式

    2. 把一下3行添加到~/.gdbinit来打开non-stop模式

    set target-async 1
    set pagination off
    set non-stop on

      然后 attach 到正在运行的线程

      gdb thrname thrID

      

    3. 然后可以用一下方式中断某个线程,其他线程保持运行; 或只运行某些线程 其他线程中断

      3. 1 下断点到某个线程

        b file:line thrNum

        thrNum 可以在gdb中  用 info thr 命令查看

        当这个线程执行到断点时,这个线程就停止了,但是其他线程不停止,还在继续执行

      3.2 切换到某个线程

         thr xthrNum

         thrNum 可以在gdb中  用 info thr 命令查看

         然后 输入命令继续执行这个线程  c

         或者 执行某几个线程

         thr apply thrNum1 thrNum2 ... continue 

         thrNum1 thrNum2 ... 为线程序号(用 info thr 命令查看)

  • 相关阅读:
    结构化数据上的 TopN 运算
    Excel 分组后计算
    主流开源 BI 产品对比
    职场人员该学什么程序语言
    Python 并不合适职场编程,SPL 才行
    v-if 和 v-show 到底有什么区别 何时用v-if 何时用v-show
    APP 在退出登录 页面 注意事项
    APP 项目,登录注册页面,注意事项
    input 文本内容 ,才用正则过滤后,内容没有实时更新 的 处理方法
    实现 长按复制粘贴文本
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/14653159.html
Copyright © 2011-2022 走看看