GDB调试-多进程与多线程程序

来源:互联网 发布:linux 多进程通信 编辑:程序博客网 时间:2024/05/17 00:59

先看一下比较经典的gdb博客:

用GDB调试程序(一)

用GDB调试程序(二)

一、gdb常用命令


二、GDB与多进程


默认设置下,在调试多进程程序时GDB只会调用主进程,但是GDB(>V7.0)支持多进程的分别与同步调试。即GDB支持同时调试多个进程。只需要设置follow-fork-mode(默认为 parent)和detach-on-fork(默认为:on)即可。

follow-fork-mode    detach-on-fork       说明

       parent                     on                 只调试主进程(GDB默认)

       child                        on                 只调试子进程

       parent                     off                 同时调试两个进程,gdb跟主进程,子进程block(阻塞)在fork位置

       child                        off                 同时调试两个进程,gdb跟子进程,主进程block在fork位置

设置方法: set follow-fork-mode[parent|child]      set detach-on-fork[on|off]

显示:show follow-fork-mode        show detach-on-fork


查询正在调试的进程:info    inferiors

显示GDB调试的所有inferior,GDB为他们分配ID。其中带*的进程是正在调试的进程。

       (GDB将每一个被调试程序的执行状态记录在一个名为inferior的结构中。一般情况下一个inferior对应一个进程,每一个inferior都有自己的地址空间。inferior有时候会在进程没有启动时就存在)

切换调试的进程:inferior <inferior number>

通过该指令可以切换到ID为number的inferior进行调试。

调加新的调试进程:add-inferior[-copies n][-exec executable]

      可以用file+executable来分配给inferior可执行文件。+增加n个inferior并执行程序为executable。如果不指定n只增加一个inferior。如果不指定executable,则执行程序留空,增加后可使用file命令重新指定执行程序。这时候创建的inferior其关联的进程并没启动。

删除一个infnum 的inferior:remove-inferiors infnum (如果inferior正在运行,则不能删除,删除之间需先kill或detach掉该inferior)

detach掉infnum的inferior:detach inferior infnum注意(inferior仍然存在,可以用run等命令执行)

kill 掉infnum的inferior:kill inferior infnum  注意(inferior仍然存在,可以用run等命令执行)

三、GDB与多线程


在多线程编程时,当我们需要调试时,有时需要控制某些线程停在断点,有些线程继续执行。有时需要控制线程的运行顺序。有时需要中断某个线程,切换到其他线程。这些都可以通过gdb实现。GDB默认支持调试多线程,跟主线程,子线程block在create+thread。

先来看一下gdb调试多线程常用命令:

info+threads:显示可以调试的所有线程。gdb会为每个线程分配一个ID(和tid不同),编号一般从1开始。后面的ID是指这个ID。

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

四、设置core

     core的意思是核心,dumped的意思就是抛出,转储,core  dumped就是核心转储的意思。当一个进程异常退出前,该进程会抛出当时该程序进程的内存详细情况存储在硬盘上,文件名通常是core,这就叫core  dump。

进程异常终止通常是因为代码存在BUG,比如非法内存访问导致段错误,事后可以用调试器检查core文件以查清错误原因,这叫做事后调试.

uname  -a   查看机器参数

ulimit  -a   查看默认参数

ulimit   -c   1024     设置core文件大小为1024

ulimit  -c   unlimit   设置core文件大小为无限

eg1(可以快速定位出问题的位置)

gdb  a.out  core.xxx

where

eg2    (在  gdb  中使用)  

 (gdb) core-file  core.xxx

原创粉丝点击