gdbserver简单使用方法

在调试内存越界相关问题时有时会遇到各种疑难杂症,这里记录一下gdbserver的使用方法。

gdbserver使用方法

1. 在ipc上运行./gdbserver 板子ip:端口号 执行程序名。 例如: ./gdbserver 192.168.2.15:6789 ipc_app.  其中192.168.2.15是ipc的ip,6789是端口。
2. 在另外一个虚拟机上运行 gdb 程序名。 例如: mips-linux-uclibc-gnu-gdb ipc_app. 其中 mips-linux-uclibc-gnu-gdb 是交叉编译环境里面的gdb, ipc_app 是拷贝到虚拟机的执行程序。
3. 在虚拟机进入gdb的调试界面后输入 target remote 板子IP:端口号。例如: target remote 192.168.2.15:6789.
4. 链接gdbserver成功后,再设置搜索动态库路径, 
set solib-search-path /home/zjf/work/compile_tool/T31X/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/lib/:/home/zjf/work/compile_tool/T31X/mips-gcc472-glibc216-64bit/mips-linux-gnu/lib/uclibc:/tmp/mtd/jz_gdb_lib/

其中/home/zjf/work/compile_tool/T31X/mips-gcc472-glibc216-64bit/mips-linux-gnu目录是在虚拟机上安装的交叉编译链的目录,/tmp/mtd/jz_gdb_lib/ 目录是把ipc里面的一些动态库拷贝出来集中放在这个目录,至于哪些库需要拷贝出来集中放,可以使用 info sharedlibrary 命令查看,看哪些动态库没有加载上就拷贝哪些库,如下

(gdb) info sharedlibrary 
From        To          Syms Read   Shared Object Library
0x77fe0ea0  0x77fe69d0  Yes (*)     /home/zjf/work/compile_tool/T31X/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/lib/ld-uClibc-0.9.33.2.so
0x77ef6df0  0x77fac070  Yes (*)     /tmp/mtd/jz_gdb_lib/libimp.so
0x77ecf220  0x77ed3920  Yes (*)     /tmp/mtd/jz_gdb_lib/libalog.so
0x77e765a0  0x77eb58c0  Yes (*)     /tmp/mtd/jz_gdb_lib/libsnia_base.so
0x77e51020  0x77e5c2a0  Yes (*)     /tmp/mtd/jz_gdb_lib/libmove_inf.so
0x77e38a70  0x77e3add0  Yes (*)     /tmp/mtd/jz_gdb_lib/libverify.so
0x77e25a50  0x77e27180  Yes (*)     /home/zjf/work/compile_tool/T31X/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/lib/libdl-0.9.33.2.so
0x77e12ce0  0x77e144a0  Yes (*)     /home/zjf/work/compile_tool/T31X/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/lib/librt-0.9.33.2.so
0x77df0f80  0x77dfe2e0  Yes (*)     /home/zjf/work/compile_tool/T31X/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/lib/libpthread-0.9.33.2.so
0x77d330b0  0x77daea80  Yes (*)     /tmp/mtd/jz_gdb_lib/libstdc++.so.6
0x77cd22b0  0x77cdadc0  Yes (*)     /home/zjf/work/compile_tool/T31X/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/lib/libm-0.9.33.2.so
0x77ca39a0  0x77cbde10  Yes         /home/zjf/work/compile_tool/T31X/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/lib/libgcc_s.so.1
0x77be2420  0x77c3b710  Yes (*)     /home/zjf/work/compile_tool/T31X/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/lib/libuClibc-0.9.33.2.so
0x77bc1e10  0x77bc5d00  Yes (*)     /tmp/mtd/jz_gdb_lib/libsysutils.so
0x77b4b290  0x77b968b0  Yes (*)     /tmp/mtd/jz_gdb_lib/libaudioProcess.so
(*): Shared library is missing debugging information.

动态库设置好后就要开始调试了,有以下调试指令

================================gdb调试命令=======================================
target remote ip:port 远程调试
set print pretty on 设置结构体打印为缩进方式
start 运行到主函数停止
c   继续运行
finish 结束当前函数
br 行号/函数 打断点
br 文件名:行号
br 断点号 if 条件   设置条件断点
watch 变量 变量改变的时候停下来 (rw(读变量停下来) aw(写变量停下来))
d 断点号 删除断点
i locals 打印当前变量 i functions 列出所有函数名字  i functions 字符匹配式 列出符合条件的函数
i frame 打印函数堆栈帧  frame 指针 打印栈帧函数
i break 打印断点信息
i threads 查看线程信息
i files 打印文件的内存信息
i proc mapping 打印程序内存信息
i signals 查看信号处理信息(可以使用handle 信号名 处理(来设置对信息的处理))
l 行数 显示源码
i sharelibrary regex (查看共享库信息)
f 1/2/3选择栈帧
set var 变量=值 改变变量的值
p 变量/指针/表达式(执行函数或者命令) 打印值或者执行函数
bt 打印调用关系
bt full 打印个帧栈的局部变量
$_ :最后停止的地址
$__:最后停止的地址的值
x/个数单格式元长度 地址  (x/nfu) : 格式化打印 x/10x16 a :从a处按十六进制打印10个16长度的值
=========================si================================================

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿木小呆呆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值