当前位置:Gxlcms > 数据库问题 > 几篇GDB的调试文章

几篇GDB的调试文章

时间:2021-07-01 10:21:17 帮助过:30人阅读

http://hi.baidu.com/janvyking999/blog/item/6697b43ac79672e315cecb5f.html

有用的:

查看当前源程序
info source

5 条件断点
break ...if cond

==,>=用法和c相同,别写成=了

info b 是显示所有断点的位置

设置监视点 === watch
当你调试一个很大的程序,并且在跟踪一个关键的变量时,发现这个变量不知在哪儿被改动过,如何才能找到改动它的地方。这时你可以使用watch命令。简单地说,监视点可以让你监视某个表达式或变量,当它被读或被写时让
程序
断下。watch命令的用法如下:
watch expression
watch指令是监视被写的,当你想监视某个表达式或变量被读的话,需要使用rwatch指令,具体用法是一样的。要注意的是,监视点有硬件和软件两种方式,如果可能linux尽可能用硬件方式,因为硬件方式在速度上要大大快于软件方式。软件方式由于要在每次执行一条指令后都要检查所要监视的值是否被改变,因此它的执行速度会大大降低。同时它也无法设置成被读时让
程序
断下,因为读操作不会改变值,所以gdb无法检测到读操作。幸运的是,目前的pc机基本都支持硬件方式。如果你想确认一下你的机器是否支持硬件,你可以在调试程序时用watch设置一个监视点,如果gdb向你显示:
hardware watchpoint num: expr

whatis 命令可以显示某个变量的类型

http://hi.baidu.com/beyond907/blog/item/c7f9a3f538da3dd2f3d3856e.html

1、程序运行参数。
    set args 可指定运行时参数。(如:set args 10 20 30 40 50)
    show args 命令可以查看设置好的运行参数。

2、运行环境。
    path <dir> 可设定程序的运行路径。
    show paths 查看程序的运行路径。
    set environment varname [=value] 设置环境变量。如:set env USER=hchen
    show environment [varname] 查看环境变量。

3、工作目录。
    cd <dir> 相当于shell的cd命令。
    pwd 显示当前的所在目录。

until 或 u
        当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。

info threads 显示所有线程

break frik.c:13 thread 28 if bartab > lim
如果是线程池,可以定义28号线程中增加断点。

我们可以使用GDB提供的command命令来设置停止点的运行命令。也就是说,当运行的程序在被停止住时,我们可以让其自动运行一些别的命令,这很有利行自动化调试。对基于GDB的自动化调试是一个强大的支持。
break foo if x>0
        commands
        printf "x is %d\n",x
        continue
        end

想在断点时打印所有线程的堆栈信息,不知道怎么设置
后来找到了语句:thread apply all backtrace

http://hi.baidu.com/beyond907/blog/item/10c86e0150ff658ce850cd6f.html

forward-search <regexp>
    search <regexp>
        向前面搜索。

    reverse-search <regexp>
        全部搜索。

(gdb) p *array@len
        $1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32,34, 36, 38, 40}

你可以设置一些自动显示的变量,当程序停住时,或是在你单步跟踪时,这些变量会自动显示。相关的GDB命令是display。

    display <expr>
undisplay <dnums...>
    delete display <dnums...>
    删除自动显示

修改程序中的变量值 set var width=47

http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=program&Number=692404&page=0&view=collapsed

info threads 
显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 
前面有*的是当前调试的线程。

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

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

thread apply all command (比如 b apply all bt 查看所有堆栈)
让所有被调试线程执行GDB命令command。

set scheduler-locking off|on|step 
估计是实际使用过多线程调试的人都可以发现,在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。 
off 不锁定任何线程,也就是所有线程都执行,这是默认值。 
on 只有当前被调试程序会执行。 
step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。

=========================

可惜了,百度空间的url都打不开了。


用gdb查看内存

格式: x /nfu <addr>

说明
x 是 examine 的缩写

n表示要显示的内存单元的个数

f表示显示方式, 可取如下值
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式
c 按字符格式显示变量。
f 按浮点数格式显示变量。

u表示一个地址单元的长度
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节


Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal),
t(binary), f(float), a(address), i(instruction), c(char) and s(string).
Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes)

举例
x/3xh buf 
表示从内存地址buf读取内容,
h表示以双字节为一个单位,
3表示三个单位,
x表示按十六进制显示


本文出自 “飞翔正义的博客” 博客,请务必保留此出处http://xzq2000.blog.51cto.com/2487359/1766862

几篇GDB的调试文章

标签:linux   表达式   源程序   文章   watch   

人气教程排行