多线程调试之痛

调试器(如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 命令查看)

转载于:https://www.cnblogs.com/lzpong/p/5881380.html

原文链接: http://www.cnblogs.com/lzpong/p/5881380.html GDB 是GUN开源组织发布的一个强大的UNIX下的程序 调试 工具。或许,平时大家更加习惯图形界面的 调试 ,比如VS上的IDE 调试 ;但是如果我们在UNIX或Linux下做软件,我们呢就更加需要熟练 GDB 这个 调试 工具。 GDB 调试 使用的是DEBUG版本的,而使用gcc或者g++默认生成的可 执行 文件为release版本,所以在生成可 执行 文件时,我们需要在命令的尾部加上 -g,这样就可以生成的... gdb 调试 info threads只能显示一个进程问题 在一个Linux环境中(dm81XX), 调试 多线程 程序不正常,info threads看不到 多线程 的信息。 查看过程: 1.先用命令maintenance print target-stack看了一下target的装载情况,发现target"multi-thread"没有被装载,用 GDB GDB 进行 调试 ,发现在 函数check_for... 启动 GDB 后,首先就是要设置 断点 ,程序 中断 后才能 调试 。在 gdb 中, 断点 通常有三种形式: 断点 (BreakPoint): 在代码的指定位置 中断 ,这个是我们用得最多的一种。设置 断点 的命令是break,它通常有如下方式: break <function>    在进入指定函数时停住 break <linenum>    在指定行号停住。 bre... linux coredump 调试 一、概念coredump:Coredump叫做核心转储,它是进程 运行 时在突然崩溃的那一刻的一个内存快照。 操作系统 在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态、 运行 堆栈等信息转储保存在一个文件里。该文件也是二进制文件,可以使用 gdb 、elfdump、objdump或者windows下的windebug、solaris下的mdb进行打... 1. 前言 还是由于最近毕设,需要修改实验室里某个有一定规模的分布式框架。由于动态 调试 真的很麻烦,这个半个月基本都在看代码和日志来分析程序。虽然经过了半个月,以现在对代码的熟悉程度,忽略 gdb 动态 调试 基本也问题不大。 但还是觉得很不舒服,很想在实际的 多线程 调试 工作中,加入 gdb 这个熟手的工具。于是今天就挑战了一下,如何在non-stop模式下,把分解器工作 线程 给停住。现在还有一个头痛的问题,还没搞懂怎么去 调试 回调函数,因为 gdb 跟不进去。 2. gdb 多线程 的三种 运行 模式 假设有t1, t2, t3三个 线程 linespec指定了 断点 设置在的源程序的行号 threadno指定了 线程 的ID ID是 GDB 分配的 可以通过info threads命令来查看正在 运行 程序中的 线程 信息 如果不指定thread &... 欢迎点击上方蓝色“泰晓科技”关注我们作者:文平波图片来源自网络1 简介这个文档记录了用 k GDB 调试 Linux 内核的全过程,都是在前人工作基础上的一些总结。以下操作都是基于特定板子来进行,但是大部分都能应用于其他平台。要使用 K GDB 调试 内核,首先需要修改 config 配置文件,打开相应的配置,配置内核启动参数,甚至修改串口驱动添加 poll 支持,然后才能通过串口远程 调试 内... 1 关于 断点 调试 断点 调试 应用程序最主要的方式之一,通过设置 断点 ,可以实现单步 执行 代码,检查变量的值以及跟踪调用栈,甚至修改进程的内存变量值或者 运行 代码,从而观察修改后的程序行为。大多数的 调试 器都是通过ptrace系统调用控制和监视进程状态,通过INT 3软件 中断 实现 断点 。当我们在代码中插入一个 断点 时,其实就是 调试 器找到指令位置(编译成机器码后的位置)嵌入一个INT 3指令,进程 运行 时遇到INT ... 下文参考以下链接:http://www.cnblogs.com/xuxm2007/archive/2011/04/01/2002162.html 首先先介绍 多线程 调试 的基本命令:  1.info threads,显示当前可 调试 的所有 线程 。每个 线程 会有 gdb 为其分配的ID,后面的操作会用到这个ID。前面带'*'号的是当前正在 调试 线程 。  2.thread ID,切换当前 调试 线程 为指定ID的 #include <stdio.h> #include <unistd.h> #include <pthread.h> #include <stdlib.h>