GDB相关

GDB十分钟教程_Liigo的博客-CSDN博客_gdb教程

bt命令就可以把这个栈的调用信息全部显示出来

栈框(stack frame),也就是一个数据单元用来描述该函数,描述函数的地址,参数,还有函数的局部变量的值等信息

前面的#0表示函数栈框的标号

frame 1 表示选择栈框1

info locals查看函数栈框里面局部变量的值

info b(break) 查看所有断点

d(delete) [断点编号] 删除断点

动态数组:
    p *array@len 
    array:数组的首地址,len:数据的长度
eg:
    (gdb) p *array@len
x 按十六进制格式显示变量。
    d 按十进制格式显示变量。
    u 按十六进制格式显示无符号整型。
    o 按八进制格式显示变量。
    t 按二进制格式显示变量。
    a 按十六进制格式显示变量。
    c 按字符格式显示变量。
    f 按浮点数格式显示变量。
eg:
    (gdb) p i
    $21 = 101
    (gdb) p/a i
    $22 = 0x65
    (gdb) p/c i
    $23 = 101 'e'

list命令可用于显示指定位置处的源代码。list命令会影响当前行和当前文件。
        list命令有多种方式指定要显示的源代码范围,可以是行号,函数名,甚至是指令地址。
        常用的如下:
        list linenum:显示指定行数附近的代码。
        list function:显示指定函数附近的代码。
        list *addr:显示指定地址附近的代码。

#设置core大小为无限
ulimit -c unlimited

#用gdb查看core文件

gdb [exec file] [core file]

foucs cmd(fs cmd) 能够让gdb同时显示源码和命令行

Ctrl + L:刷新窗口
Ctrl + x,再按1:单窗口模式,显示一个窗口
Ctrl + x,再按2:双窗口模式,显示两个窗口
Ctrl + x,再按a:回到传统模式,即退出layout,回到执行layout之前的调试窗口。
命令脚本
#gdbtest.sh
file gdbtest            <----- 制定目标文件为gdbtest  
break 5  
run  
set x=5  
c  
q
gdb -x gdbtest.sh  

命令脚本

gdb提供了如下的流程控制命令:

(1)条件命令:if...else...end。这个同其它语言中提供的if命令没什么区别,只是注意结尾的end
(2)循环命令:while...end。gdb同样提供了loop_breakloop_continue命令分别对应其它语言中的breakcontinue,另外同样注意结尾的end

另外gdb还提供了很多输出命令。比方说echo命令,如果仅仅是输出一段文本,echo命令特别方便。此外还有和C语言很相似的支持格式化输出的printf命令,等等。

脚本文件的注释也是以#开头的,这个同很多其它脚本语言都一样。

最后指出的是在gdb中执行脚本要使用source命令,例如:“source xxx.gdb”。

define search_byte
XXXXX
end

document search_byte
    XXXX
end

打开gdb的命令历史功能,通常可以先执行下面的3个gdb命令

set history filename gdb.history
set history save on
set history size 1000
gdb命令脚本写法  
有两种方式来使用这个脚本: 
1)启动gdb时候 
gdb在启动的时候,会在当前目录下查找".gdbinit"这个文件,并把它的内容作为gdb命令进行解释,所以如果我把脚本命名为".gdbinit",这样在启动的时候就会处理这些命令。 
2)gdb运行期间 
可以使用 source script-file 来解释gdb命令脚本script-file 

Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal ] 可以这样解决这个问题 "set breakpoint pending on" 

查看变量类型 ptype [var]

查看函数 whatis [fun]

set verbose on

# 设置库搜索路径
set solib-search-path XXX:YYY
# 查看已经加载的库信息
info sharedlibrary

# 日志
set logging file gdb.out
set logging on
......
set logging off 

# 查看线程
info threads
# 所有线程的堆栈
thread apply all bt

# 调试core
gdb
file /path/to/executor
core /path/to/core/file

如果在Coredump文件载入过程中,或者info sharedlibrary命令时,出现" Cannot access memory at address 0x87000069 "这样的错误,这通常是由于所使用的主执行文件("file"命令或"exec-file"命令)与Coredump文件("core"命令或"core-file"命令)两者不匹配导致的。这个时候应检查主执行文件是否是生成Coredump时所用的主执行文件,只要差一点,就可能导致动态库信息读取错误。

 如果载入过程中有" warning: .dynamic section for "/lib/librt.so.1" is not at the expected address (wrong library or version mismatch?) "这样的提示,这通常是库搜索路径设置错误,GDB载入了错误的库文件导致的。这时,应使用info sharedlibrary命令查看相应库的载入路径,并使用set sysroot或set solib-search-path修改搜索路径来将错误的库修正到正确的路径上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值