gdb 全局变量被修改_gdb note

本文详述了gdb调试器的各种高级用法,包括自定义命令`gobt`和`showmem`,记录调试日志,设置断点,处理信号,跟踪变量和表达式变化,以及调试多进程和多线程程序的方法。通过实例演示了如何在gdb中查看内存、修改变量值、打印数组内容和循环控制等操作,是gdb调试的实用指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.gdbinit###

handle pass

handle nostop

set confirm off

set pagination off

set print pretty

set target-async 0

set scheduler-locking on

set non-stop off

.gdbinit###

define gobt

set logging file ~/gdblog ## 改变记录文件,默认记录文件是gdb.txt。

默认这个项目是关闭,

也就是以添加的形式将记录信息写入文件,这样之前文件中的信息不会被覆盖掉。

注意:如果设置这个选项的时候记录功能已经打开,需要关闭记录功能再重新打开才能起作用。

set logging overwrite off

set logging redirect on ## 设置输出信息只记录到文件不作显示。

set logging on

bt

set logging off

shell echo #Local Variables: # >> ~/gdblog

shell echo #mode: compilation # >> ~/gdblog

shell echo #End: # >> ~/gdblog

shell emacs -n ~/gdblog

end

define showmem

set

arg0

set

arg1

printf "%p:%d\n",

LEN

set $COUNT=0

while ($COUNT < $LEN)

printf "0x%02x ", *(unsigned char*)($DATA+$COUNT)

set $COUNT=$COUNT+1

if (0 == ($COUNT % 16))

printf "\n"

end

end

printf "\n"

end

p/x data@len

p/x data[0]@len

p/x *data@len

variable, 变量

set

VAR=$VAR+1

condition, 条件

if (10 < $VAR)

c

end

loop, 循环

while (

VAR, obj.size

set

VAR+1

end

-silent

gdb -args ./a.out -c -m -t

set args –b –x

show args

run

cd

dir

查看数组的前5个值

p arr[0]@5

signal处理

handle pass

handle nostop

断点

break 46 if testsize==100

break csras_server/server.cpp:46

break 123

commands #默认是给最近定义的断点

silent

watch i

c

end

commands 2 #直接指定给哪一个断点

enable

c

end

clear server.cpp:123

tui模式

(cmd)command

(src)source

(asm)assembly

(reg)register

layout src

layout asm

layout split

winheight src +/-5

focus next/prev

gdb 调试跟踪多进程程序

gdb只能跟踪一个进程(默认是跟踪父进程),而不能同时跟踪多个进程,

可以设置gdb跟踪父进程还是子进程, 命令如下:

set follow-fork-mode parent 跟踪父进程, 默认

set follow-fork-mode child 跟踪子进程

set scheduler-locking on # 多线程下禁止线程切换

set scheduler-locking off|on|step #估计是实际使用过多线程调试的人都可以发现,

#在使用step或者continue命令调试当前被调试线程的时候,

#其他线程也是同时执行的,怎么只让被调试程序执行呢?

#通过这个命令就可以实现这个需求。

#off 不锁定任何线程,也就是所有线程都执行,这是默认值。

#on 只有当前被调试程序会执行。

#step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,

#这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。

break test.c:123 thread all # 在所有线程中相应的行上设置断点

thread apply ID1 ID2 command # 让一个或者多个线程执行GDB命令command。

thread apply all command # 让所有被调试线程执行GDB命令command

set target-async 1 # 异步模式

set pagination off

set non-stop on

设置core环境

uname -a 查看机器参数

ulimit -a 查看默认参数

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

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

帮助

help xxx

apropos xxx

跳转

jump 5

j 123

需要注意的是,跳转到第5行执行完毕之后,如果后面没有断点则继续执行,而并不是停在那里了。

可配合tbreak使用。

执行N次下一步

next N

util N

检测表达式变化则停住

watch i != 10

这里,i != 10这个表达式一旦变化,则停住。watch 为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序(也是一种断点)。

rwatch 当expr被读时,停住程序。

awatch 当expr被读或被写时,停住程序。

监视指定内存

p &(s_packet->data)

$10 = (const uint8_t **) 0x7fffec0015d8

awatch (uint8_t)0x7fffec0015d8

info frame 查看当前函数的程序语言

info source 显示当前的调试源文件

whatis var 显示一个变量var的类型

kill 终止一个正在调试的程序

whatis var 显示一个变量var的类型

ptype var 以更详细的方式显示变量var的类型,这里,会打印出var的结构定义

print x=4 修改运行时候的变量值

备常用命令:

1.常看源码:list(l)

list  行号

list  当前行号的正偏移

list  当前行号的负偏移

list  哪个文件的哪一行

list  函数名

list  文件的哪个函数

list  程序运行时语句在内存中的地址

2.设置断点:break(b)

break  指定函数断点

break  指定行号断点

break  当前行号的正/负偏移

break  哪个文件的哪一行

break  运行中的内存地址

break 不带参数,下一条指令停止处

break ... if  在运行中,当condition条件满足时停止。

eg. break if i=100 //当i=100时,立即停止

break foo if i=100 //断点设置在foo中,断点条件是i-100, 一点在函数foo中,i的值等于100,被停止。

3.查看信息:info

info break 查看断点信息

info locals 打印出当前函数中所有局部变量及其值

info stack 查看栈中信息

info frame 更详细的栈层地址信息

info args 查看参数信息

info registers/info all-registers 查看(所有)寄存器信息

info sources 查看项目的源代码信息

4.维护breakpoint:disable/enable/clear/delete

disable(dis) 【breakpoints】 【range...】

如果没有参数,则停止所有的断点,

enable 【breakpoints】【range】

clear ///

清楚已定义的停止点

delete [breakpoints] [ranga...]

删除指定的断点

以下是list命令的說明。

參數 說明

list filename:number 列出某檔案的第幾行,檔案是可省略的。

list [function] 列出某函數的程式碼

list 繼續印出程式碼

list - 印出上一次list的程式碼的前一段程式碼(類似向上翻動)

show listsize 顯示現在一次印出幾行

set listsize 設定一次印出幾行

查看文件中某变量的值

file::variable

function::variable

可以通过这种形式指定你所想查看的变量,是哪个文件中的或是哪个函数中的。例如,查看文件f2.c中的全局变量x的值:

gdb) p 'f2.c'::x

如果a是一个数组,10个元素,如果要显示则:

(gdb) print *a@10

这样,会显示10个元素,无论a是double或者是int的都会正确地显示10个元素。

用16进制显示(var)值

print /x var

这里可以知道,print可以指定显示的格式,这里用'/x'表示16进制的格式。

可以支持的变量显示格式有:

x 按十六进制格式显示变量。

d 按十进制格式显示变量。

u 按十六进制格式显示无符号整型。

o 按八进制格式显示变量。

t 按二进制格式显示变量。

a 按十六进制格式显示变量。

c 按字符格式显示变量。

f 按浮点数格式显示变量。

如果a是一个数组,10个元素,如果要显示则:

print *a@10

p a[0]@10

print /x var

这里可以知道,print可以指定显示的格式,这里用'/x'表示16进制的格式。

可以支持的变量显示格式有:

x 按十六进制格式显示变量。

d 按十进制格式显示变量。

u 按十六进制格式显示无符号整型。

o 按八进制格式显示变量。

t 按二进制格式显示变量。

a 按十六进制格式显示变量。

c 按字符格式显示变量。

f 按浮点数格式显示变量。

循环

set $PID=1

PID+1

while (

TID

thread

PID=$PID+1

end

打印所有线程的栈

set logging file

set logging on

thread apply all bt

set logging off

quit

打印字符串,无省略

printf "%s\r\n", addr

默认编译的时候,调试过程是看不见宏的值的。编译时候需要给选项。-g3

gcc -g3 -o test.c test

察看宏(macro)命令: p macroname(...)

就像察看一个普通变量一样。如果只想看宏的展开形势,就用如下命令:

macro expand macroname(...) 查看展开形式

还可以用info macro macroname 查看宏定义。

保存断点到文件

save breakpoint outputfile

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值