GDB 多线程调试

2023-11-11

http://hi.baidu.com/hcq11/blog/item/9f5bfc6e696209d680cb4a25.html 

http://hi.baidu.com/litto/blog/item/759389dd198111375882dd1e.html 

http://blogold.chinaunix.net/u3/94700/showart_2389432.html   <推荐阅读>

 

先介绍一下GDB多线程调试的基本命令。

info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程。

thread ID 切换当前调试的线程为指定ID的线程。

break thread_test.c:123 thread all 在所有线程中相应的行上设置断点

thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command。 

thread apply all command 让所有被调试线程执行GDB命令command。

set scheduler-locking off|on|step 估计是实际使用过多线程调试的人都可以发现,在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。off 不锁定任何线程,也就是所有线程都执行,这是默认值。 on 只有当前被调试程序会执行。 step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。

 

gdb对于多线程程序的调试有如下的支持:

  • 线程产生通知:在产生新的线程时, gdb会给出提示信息

(gdb) r
Starting program: /root/thread
[New Thread 1073951360 (LWP 12900)]
[New Thread 1082342592 (LWP 12907)]---以下三个为新产生的线程
[New Thread 1090731072 (LWP 12908)]
[New Thread 1099119552 (LWP 12909)]

  • 查看线程:使用info threads可以查看运行的线程。

(gdb) info threads
  4 Thread 1099119552 (LWP 12940)   0xffffe002 in ?? ()
  3 Thread 1090731072 (LWP 12939)   0xffffe002 in ?? ()
  2 Thread 1082342592 (LWP 12938)   0xffffe002 in ?? ()
* 1 Thread 1073951360 (LWP 12931)   main (argc=1, argv=0xbfffda04) at thread.c:21
(gdb)

注意,行首的蓝色文字为gdb分配的线程号,对线程进行切换时,使用该该号码,而不是上文标出的绿色数字。

另外,行首的红色星号标识了当前活动的线程

  • 切换线程:使用 thread THREADNUMBER 进行切换,THREADNUMBER 为上文提到的线程号。下例显示将活动线程从 1 切换至 4。

(gdb) info threads
   4 Thread 1099119552 (LWP 12940)   0xffffe002 in ?? ()
   3 Thread 1090731072 (LWP 12939)   0xffffe002 in ?? ()
   2 Thread 1082342592 (LWP 12938)   0xffffe002 in ?? ()
* 1 Thread 1073951360 (LWP 12931)   main (argc=1, argv=0xbfffda04) at thread.c:21
(gdb) thread 4
[Switching to thread 4 (Thread 1099119552 (LWP 12940))]#0   0xffffe002 in ?? ()
(gdb) info threads
* 4 Thread 1099119552 (LWP 12940)   0xffffe002 in ?? ()
   3 Thread 1090731072 (LWP 12939)   0xffffe002 in ?? ()
   2 Thread 1082342592 (LWP 12938)   0xffffe002 in ?? ()
   1 Thread 1073951360 (LWP 12931)   main (argc=1, argv=0xbfffda04) at thread.c:21
(gdb)

 

后面就是直接在你的线程函数里面设置断点,然后continue到那个断点,一般情况下多线程的时候,由于是同时运行的,最好设置 set scheduler-locking on

这样的话,只调试当前线程


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GDB 多线程调试 的相关文章

  • 如何动态调试Python的第三方库

    注意 本文方法仅限于调试安装时附带py源码的库 如sklearn 引入 用sklearn中的sklearn feature extraction text TfidfTransformer来获取TF特征 但发现sklearn的计算结果与我手
  • 内核调试方法 三

    目录 大海里的鱼有很多 而我们需要的是鱼钩一只 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 第一部分 基础知识 总纲 内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 建立调试环境 发行版的选择和
  • Warning: Could not find file 。。。to copy.

    老师给了一个完整程序 但是没跑起来 我的做法是 点击跳转 删掉所在行 就可以了
  • 章节1 概述 - Segger SystemView使用手册(译文)

    本文博客链接 http blog csdn net bjr2016 作者 bjr2016 未经允许不得转载 1 概述 本节描述SEGGER SystemView的一般使用 1 1 SEGGER SystemView 是什么 SystemVi
  • 开发遇到问题全记录【增量】

    1 MyEclipse内部启动tomcat jar包冲突 在
  • Tomcat debug模式启动

    在 CATALINA HOME bin startup bat中添加以下任意一行配置 SET JAVA OPTS Xdebug Xrunjdwp transport dt socket address 8787 server y suspe
  • [完美解决]当前不会命中断点。还没有为该文档加载任何符号。

    原文地址 http www cnblogs com furenjun archive 2011 05 31 2064287 html 概述 在调试SL项目 我重装了电脑 项目也是重新配置的 后来在调试的时候发现断点进不去 折腾了两个小时 将
  • 使用VS Code断点调试PHP

    vs code 使用一款杰出的轻量级代码编辑器 其中的插件工具不胜枚举而且还在不断增加 使用 vs code 调试 php 代码更是方便简洁 下面我们来一起看一下 1 安装 XDebug 扩展 调试 php 代码最常用的就是 XDebug
  • windows下各调试器条件断点实例

    0x00 前言 发现网上很多关于ollydbg和windbg的条件断点的设置是错误的 所以这里总结下 0x01 字符串条件断点 ollydbg unicode字符串 bp kernel32 CreateFileW UNICODE esp 4
  • GDB+GDBserver 远程调试

    本文转自 https www cnblogs com Dennis mi articles 5018745 html 如若侵权 会及时删除 内容摘要 远程调试环境由宿主机GDB和目标机调试stub共同构成 两者通过串口或TCP连接 使用 G
  • js断点和调试学习总结3

    使用Chrome调试JavaScript的断点设置和调试技巧 你是怎么调试 JavaScript 程序的 最原始的方法是用 alert 在页面上打印内容 稍微改进一点的方 法是用 console log 在 JavaScript 控制台上输
  • Android强大的原生调试工具adb的常用命令

    文章目录 ADB简介 常用命令 列出链接的设备 进入设备的shell环境 设备日志 安装应用程序 卸载应用程序 将本地文件复制到调试设备上 将设备上的文件拉取到本地 启动程序 强制停止程序运行 截图 屏幕录制 列出调试设备所有的应用的报名
  • 快速查找Unity死循环

    我们先建立一个新工程 新建C 文件 然后在Start函数中加入以下代码 void Start while true int i 1 把这个C 文件挂到场景摄像机或其它GameObject上 打开这个工程对应的VS工程 如何用VS编辑unit
  • GDB 多线程调试

    http hi baidu com hcq11 blog item 9f5bfc6e696209d680cb4a25 html http hi baidu com litto blog item 759389dd198111375882dd
  • 你开发的软件不知道哪里跑飞闪退了?这个办法可以帮忙定位(查看dump)

    QT生成dump pdb文件 使用windbg打开分析查看堆栈 定位程序崩溃位置 你开发的软件不知道哪里跑飞闪退了 这个办法可以帮忙定位 https zhuanlan zhihu com p 102103083
  • 利用Console来调试JS程序、Console用法总结

    利用Console来调试JS程序 Console用法总结 1 一 什么是 Console Console 是用于显示 JS和 DOM 对象信息的单独窗口 并且向 JS 中注入1个 console 对象 使用该对象 可以输出信息到 Conso
  • 在dos下使用debug被提示incorrect ms dos version的解决办法

    原创 在dos下使用debug被提示incorrect ms dos version的解决办法 首先可以确定一点 直接使用debug时它是直接在当前目录下寻找的 一旦当前目录下没有debug或debug版本不合适 则会出错 直接在 开始 中
  • 【VS2010学习笔记】【错误调试】error LNK1123:转换到COFF期间失败;文件无效或者损坏

    在调试串口通信程序的过程中 将以前能够成功运行的程序在电脑上重新运行的时候 出现下面的错误 如下图所示 解决方法 连接器LNK是通过调用cvtres exe完成文件向coff格式的转换的 所以出现这种错误的原因就是cvtres exe出现了
  • 远程调试Android/IOS设备/微信网页方法汇总

    以下汇总现在可远程调试手机网页的几个方法 基本上官方都有详细的说明文档 可移步至相关网站查看 这里就不赘述使用 操作方法了 微信web开发者工具 PC客户端 官方说明文档 支持Windows和Mac系统 支持调试Android和IOS设备
  • Tomcat开启远程调试端口

    部署环境 Linux 亲测成功 tomcat7 bin startup sh的文件开头位置添加 declare x CATALINA OPTS server Xdebug Xnoagent Djava compiler NONE Xrunj

随机推荐

  • postman-token的作用

    Postman生成的代码中的postman token是什么 What is the postman token in generated code from Postman 这主要用于绕过Chrome 等其他浏览器 中的错误 如果XMLH
  • QEMU/KVM PCI Passthrough(i350) & DPDK 网络性能测试

    QEMU KVM PCI Passthrough i350 DPDK 网络性能测试 硬件要求 CPU必须支持硬件虚拟化 Intel VT d or AMD Vi 和 IOMMU 原图链接 主机配置 设置iommu IOMMU kernel
  • kmp算法(最简单最直观的理解,看完包会)

    本文将以特殊的方式来让人们更好地理解kmp算法 不包括kmp算法的推导 接下来 我们将从朴素算法出发 在这之前 我们先设主串为S 模式串为T 我们要解决的询问是主串中是否包含模式串 即T是否为S的子串 版权声明 本文为原创文章 转载请标明出
  • c++ 继承 学习总结1 继承的基本语法

    前言 继承的作用是减少程序中重复的代码段 如果程序中有很多重复的代码段 可以考虑一下能否使用继承 继承的语法 class 子类 继承方式 父类 include
  • 特征提取-特征工程

    目录 1 定义 2 字典特征提取 3 英文 本特征提取 4 中文 本特征提取 1 定义 将任意数据 如 本或图像 转换为可 于机器学习的数字特征 2 字典特征提取 from sklearn feature extraction import
  • 【算法】树状数组维护总结

    本文仅对树状数组的使用作一个总结 并非讲解 这里的操作都对长度为 n n n 的数组 a a a 进行操作 单点修改 区间查询 暴力做法 修改
  • java使用原始套接字技术进行数据包截获_Linux零拷贝技术,看完这篇文章就懂了...

    本文讲解 Linux 的零拷贝技术 云计算是一门很庞大的技术学科 融合了很多技术 Linux 算是比较基础的技术 所以 学好 Linux 对于云计算的学习会有比较大的帮助 本文借鉴并总结了几种比较常见的 Linux 下的零拷贝技术 相关的引
  • python的pyecharts绘制各种图表详细(代码)

    环境 pyecharts库 echarts countries pypkg echarts china provinces pypkg echarts china cities pypkg 数据 2018年4月16号的全国各地最高最低和天气
  • 5.5js

    1 JavaScript简介 什么是JavaScript JavaScript 是 种客户端脚本语 脚本语 是 种轻量级的编程语 JavaScript 通常被直接嵌 HTML 由浏览器解释执 JavaScript 是 种解释性语 就是说 代
  • Deepin 手动分区记录

    起初安装Deepin 采用手动分区 总是安装失败 经过以下分区就成功安装了 efi 分区 默认300m boot 分区 默认 512m 交换分区 swap 等于你的内存大小 分区 15G home 分区剩余全部容量 home可以设置也可以不
  • brpc组件bvar源码解析(三)Variable、Reducer和Adder

    1 Variable类 Variable是所有bvar的基类 是一个纯虚类 拥有的唯一的成员变量是 name Variable类中的接口分为几类 描述相关的 子类实现纯虚函数describe 目的是将bvar的值写入ostream get
  • 验证码倒计时

    获取验证码倒计时 return second 120 getCodeFn let flag true if this user phone this http isPhone this user phone false this http
  • 斐讯 K2 路由器 无线中继 无线扩展设置教程图文

    斐讯 K2 路由器无线扩展设置教程 1 连接上k2路由器无线网络 2 登录k2路由器管理页面 192 168 2 1 3 上网设置 4 无线设置 5 设置k2无线扩展功能 6 选择主路由器无线网络 7 设置无线网络信息wifi名称 wifi
  • 详解redis的哨兵模式(1)

    目录 1 背景 2 实现过程 2 1 初始化服务器 2 2 将普通Redis服务器使用的代码替换成Sentinel专用代码 2 3初始化Sentinel状态 2 4初始化sentinel状态的masters属性 2 5创建连向主服务器的网络
  • 视频重编码为h265重新封装MP4并截断

    MP4 重编码重封装 分辨率和编码格式 转为h265 调整 XFormat h pragma once include
  • 抽象工厂模式-Abstract Factory Pattern

    抽象工厂模式 Abstract Factory Pattern 抽象工厂模式 Abstract Factory Pattern 提供一个创建一系列相关或相互依赖对象的接口 而无须指定它们具体的类 抽象工厂模式又称为Kit模式 它是一种对象创
  • SQL Server为数据表增加列(字段)的SQL语句

    下面是一个示例 ALTER TABLE TableName ADD NewField DECIMAL 18 2 NOT NULL DEFAULT 0 上面的代码为 TableName 表增加了一个名为 NewField 的列 字段 其数据类
  • 8.28网络编程作业

    TCP服务器端 include
  • Java多线程 - 线程状态

    线程状态 五个状态 新生 就绪 运行 死亡 阻塞 停止线程 不推荐使用JDK提供的stop destroy 方法 已弃用 推荐线程自己停止 建议用一个标志位进行终止变量 到flag false 则终止线程运行 public class St
  • GDB 多线程调试

    http hi baidu com hcq11 blog item 9f5bfc6e696209d680cb4a25 html http hi baidu com litto blog item 759389dd198111375882dd