博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gdb + gdbserver 修改内存值
阅读量:4117 次
发布时间:2019-05-25

本文共 2999 字,大约阅读时间需要 9 分钟。

本次调试,用到了GDB修改内存的命令。先将断点加到函数处,然后检查传入的参数放在何处,再将传入的参数修改,然后继续运行。

结果,按修改后的参数进行了执行。
代码如下,myfunc将入参变成2倍返回:

cat test.c#include 
int myfunc(int i){ return i*2;}int main(){ int x = myfunc(10); printf("x=%d\n",x); return 0;}

1、为支持在MIPS上,进行交叉编译

/opt/toolschain/cavium2/bin/mips64-octeon-linux-gnu-gcc -mabi=n32 -g -o test2 test.c2、上传到板子,用GDBSERVER运行侦听1234端口等待连接

/var/tmp # ./gdbserver 10.12.2.240:1234 ./test2

Process ./test2 created; pid = 1692
Listening on port 1234  - 执行时停留在这
Remote debugging from host 10.12.0.254 -- 有连接时提示

[ERHMG2V100D005:3555s][ERHMG2V100D005:3555s][ERHMG2V100D005:3555s][ERHMG2V100D005:3556s][ERHMG2V100D005:3556s][ERHMG2V100D005:3944s]x=2 - 执行结果

Child exited with status 0

GDBserver exiting

 

4、在LINUX主机,用GDB调试。

x/1xw 0xnnnnnnnn
查看结果现在是a
set *0xnnnnnnnn=1
x/1xw 0xnnnnnnnn
结果修改成了1
再执行,发现运行结果已经变成了2

完整调试日志如下:

info bNum     Type           Disp Enb Address    What1       breakpoint     keep y   0x10000670 in myfunc at test.c:5    breakpoint already hit 1 time(gdb) cContinuing.Breakpoint 1, myfunc (i=10) at test.c:55       return i*2;(gdb) x/5i $pc=> 0x10000670 
: lw v0,0(s8) 0x10000674
: sll v0,v0,0x1 0x10000678
: move sp,s8 0x1000067c
: ld s8,24(sp) 0x10000680
: addiu sp,sp,32(gdb) x/5i myfunc 0x10000660
: addiu sp,sp,-32 0x10000664
: sd s8,24(sp) 0x10000668
: move s8,sp 0x1000066c
: sw a0,0(s8)=> 0x10000670
: lw v0,0(s8)(gdb) x/10i myfunc 0x10000660
: addiu sp,sp,-32 0x10000664
: sd s8,24(sp) 0x10000668
: move s8,sp 0x1000066c
: sw a0,0(s8)=> 0x10000670
: lw v0,0(s8) 0x10000674
: sll v0,v0,0x1 0x10000678
: move sp,s8 0x1000067c
: ld s8,24(sp) 0x10000680
: addiu sp,sp,32 0x10000684
: jr ra 0x10000688
: nop(gdb) info $s8Undefined info command: "$s8". Try "help info".(gdb) p $s8$1 = 2145385424(gdb) info reg zero at v0 v1 R0 0000000000000000 0000000000000001 0000000000000000 0000000077fb44e0 a0 a1 a2 a3 R4 000000000000000a 000000007fdffd14 000000007fdffd1c 000000007fda5a90 a4 a5 a6 a7 R8 0000000077fb9e40 0000000077fb3788 000000007fdffd10 000000007fdffe41 t0 t1 t2 t3 R12 0000000077e24678 0000000077ff5000 0000000010010964 000000007fdffaa0 s0 s1 s2 s3 R16 0000000000000000 0000000000000000 0000000000000000 0000000010052641 s4 s5 s6 s7 R20 000000001006458c 0000000010060000 0000000000000008 ffffffffffffffff t8 t9 k0 k1 R24 0000000000000001 000000001000068c 0000000077fb7148 0000000000000000 gp sp s8 ra R28 0000000077fb9e40 000000007fdffbd0 000000007fdffbd0 00000000100006a8 status lo hi badvaddr 0000000004109cf3 0000000000005e17 00000000000001a5 0000000077e56490 cause pc 0000000000800024 0000000010000670 fcsr fir restart 0000000000000000 0000000000739600 0000000000000000 (gdb) x/1xw 7fdffbd0Invalid number "7fdffbd0".(gdb) x/1xw 0x7fdffbd00x7fdffbd0: 0x0000000a(gdb) set 0x7fdffbd0=1Left operand of assignment is not an lvalue.(gdb) set *0x7fdffbd0=1(gdb) x/1xw 0x7fdffbd00x7fdffbd0: 0x00000001(gdb) cContinuing.[Inferior 1 (process 1692) exited normally](gdb)

转载地址:http://soypi.baihongyu.com/

你可能感兴趣的文章
openlayers安装引用
查看>>
js报错显示subString/subStr is not a function
查看>>
高德地图js API实现鼠标悬浮于点标记时弹出信息窗体显示详情,点击点标记放大地图操作
查看>>
初始化VUE项目报错
查看>>
vue项目使用安装sass
查看>>
HTTP和HttpServletRequest 要点
查看>>
在osg场景中使用GLSL语言——一个例子
查看>>
关于无线PCB中 中50欧姆的特性阻抗的注意事项
查看>>
Spring的单例模式源码小窥
查看>>
后台服务的变慢排查思路(轻量级应用服务器中测试)
查看>>
MySQL中InnoDB事务的默认隔离级别测试
查看>>
微服务的注册与发现
查看>>
bash: service: command not found
查看>>
linux Crontab 使用 --定时任务
查看>>
shell编程----目录操作(文件夹)
查看>>
机器学习-----K近邻算法
查看>>
HBASE安装和简单测试
查看>>
关于程序员的59条搞笑但却真实无比的编程语录
查看>>
搞笑--一篇有趣的文章编译自一篇西班牙博客。有一位美丽的公主,被关押在一个城堡中最高的塔上,一条凶恶的巨龙看守着她,需要有一位勇士营救她…
查看>>
非常不错 Hadoop 的HDFS (Hadoop集群(第8期)_HDFS初探之旅)
查看>>