GDB调试多进程和多线程

您所在的位置:网站首页 gdb多线程多进程如何调试跟踪 GDB调试多进程和多线程

GDB调试多进程和多线程

#GDB调试多进程和多线程| 来源: 网络整理| 查看: 265

GDB调试单进程 参数列表

命令

命令缩写

命令说明

list

l

显示多行源代码

break

b

设置断点,程序运行到断点的位置会停下来

info

i

描述程序的状态

run

r

开始运行程序

display

disp

跟踪查看某个变量,每次停下来都显示它的值

step

s

执行下一条语句,如果该语句为函数调用,则进入函数执行其中的第一条语句

next

n

执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句)

print

p

打印内部变量值

continue

c

继续程序的运行,直到遇到下一个断点

set var name=v

 

设置变量的值

start

st

重新开始执行程序,在main函数的第一条语句前面停下来

file

 

装入需要调试的程序

kill

k

终止正在调试的程序

watch

 

监视变量值的变化

backtrace

bt

查看堆栈信息(也就是函数调用信息)

frame

f

查看栈帧

quit

q

退出GDB环境

注意:

break不能对{}类似的括号使用,因为这些不属于机器指令。

print 可以打印变量的值,也可以打印地址。p &a(打印变量a的地址)

在gdb中使用 thread apply all bt 查看所用线程堆栈信息。

bt 打印当前的函数调用栈的所有信息。

(gdb) bt

#0 func (n=250) at tst.c:6

#1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30

#2 0x400409ed in __libc_start_main () from /lib/libc.so.6

 

从上可以看出函数的调用栈信息:__libc_start_main --> main()--> func()

加入心在所在的栈帧是0,也就是在func函数中,那么利用frame 2可以进入main函数的栈帧。

dispaly k,比如k是一个变量,那么每次next,都会显示k这个变量的值。

watch k,和display不同的是,每次next,只有k的值发生变化的时候,才会显示k的值。

函数调用栈的查看

启动GDB #include int main(int argc,const char* argv[]) { printf("args num=%d\n",argc); for(int i=0;iV7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。

 设置方法:

set follow-fork-mode [parent|child]   

set detach-on-fork [on|off]

   查询正在调试的进程:info inferiors   切换调试的进程: inferior    添加新的调试进程: add-inferior [-copies n] [-exec executable] ,可以用file executable来分配给inferior 可执行文件。   其他:remove-inferiors infno, detach inferior   #include #include #include #include int main() { pid_t pid; pid=fork(); if(pid


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3