GDB十分钟教程_Liigo的博客-CSDN博客_gdb教程
bt命令就可以把这个栈的调用信息全部显示出来
栈框(stack frame),也就是一个数据单元用来描述该函数,描述函数的地址,参数,还有函数的局部变量的值等信息
前面的#0表示函数栈框的标号
frame 1 表示选择栈框1
info locals查看函数栈框里面局部变量的值
info b(break) 查看所有断点
d(delete) [断点编号] 删除断点
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同时显示源码和命令行
#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_break
和loop_continue
命令分别对应其它语言中的break
和continue
,另外同样注意结尾的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命令脚本写法
有两种方式来使用这个脚本:
gdb在启动的时候,会在当前目录下查找".gdbinit"这个文件,并把它的内容作为gdb命令进行解释,所以如果我把脚本命名为".gdbinit",这样在启动的时候就会处理这些命令。
可以使用 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修改搜索路径来将错误的库修正到正确的路径上。