c语言多线程怎么用gdb调试(GDB调试-多进程与多线程程序)

用GDB调试程序

GDB的命令概貌

———————

启动gdb后,就你被带入gdb的调试环境中,就可以使用gdb的命令开始调试程序了,gdb的命令可以使用help命令来查看,如下所示:

/home/hchen> gdb

GNU gdb 5.1.1

Copyright 2002 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you are

welcome to change it and/or distribute copies of it under certain conditions.

Type "show copying" to see the conditions.

There is absolutely no warranty for GDB. Type "show warranty" for details.

This GDB was configured as "i386-suse-Linux".

(gdb) help

List of classes of commands:

aliases -- Aliases of other commands

breakpoints -- Making program stop at certain points

data -- Examining data

files -- Specifying and examining files

internals -- Maintenance commands

obscure -- Obscure features

running -- Running the program

stack -- Examining the stack

二、GDB与多进程

c语言多线程怎么用gdb调试(GDB调试-多进程与多线程程序)(1)

默认设置下,在调试多进程程序时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

c语言多线程怎么用gdb调试(GDB调试-多进程与多线程程序)(2)

查询正在调试的进程: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与多线程

c语言多线程怎么用gdb调试(GDB调试-多进程与多线程程序)(3)

在多线程编程时,当我们需要调试时,有时需要控制某些线程停在断点,有些线程继续执行。有时需要控制线程的运行顺序。有时需要中断某个线程,切换到其他线程。这些都可以通过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

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页