多线程调试之痛
调试器(如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 &amp;amp;lt;stdio.h&amp;amp;gt;
#include &amp;amp;lt;unistd.h&amp;amp;gt;
#include &amp;amp;lt;pthread.h&amp;amp;gt;
#include &amp;amp;lt;stdlib.h&amp;amp;gt;