GDB调试,遭遇“cannot access memory at address”

jiankevin 2008-01-23 07:55:14
hi, 大家好!

本人系GCC小菜鸟,因最近工作需要,在WINDOWS上安装了MINGW32调试XviD代码。从网络上下载了代码后,修改了xvidcore-1.0.3/buid/generic/makefile文件,将源文件的如下内容:
CFLAGS = $(ARCHITECTURE) $(BUS) $(ENDIANNESS) $(FEATURES) $(SPECIFIC_CFLAGS)
修改为:
CFLAGS = -g $(ARCHITECTURE) $(BUS) $(ENDIANNESS) $(FEATURES) $(SPECIFIC_CFLAGS)
即添加GDB调试选项,然后configure-->make-->make install,最后在'usr/local'下生成了xvidcore.a,xvidcore.dll和xvidcore.dll.a。

下面的步骤用【1】【2】..列出。

【1】cd到examples文件夹下,使用如下命令:
$gcc -g -DARCH_IS_LITTLE_ENDIAN -DARCH_IS_GENERIC -DARCH_IS_32BIT -o xvid_decraw -I ../src xvid_decraw.c ../build/generic/=build/xvidcore.a
成功,生成xvid_decraw.exe。
【2】开始GDB。
$gdb xvid_decraw.exe
【3】list到指定的位置,xvid_decraw.c的699行,这一行代码为:
699: ret = xvid_decore(dec_handle, XVID_DEC_DECODE, &xvid_dec_frame, xvid_dec_stats);
【4】设置断点
$b 699
设置成功
【5】运行
$run -i test.mp4 -c rgb24 -f tga -d
上面的参数表示输入test.mp4文件,允许输出为RGB24位的TGA文件。
【6】停在断点处,此时输入‘s’,单步进入该函数,由于该函数在decoder.c中,已经被编译成library,即存在于前面的xvidcore.a中。
【7】 此时list可以看到decoder.i函数中的所有函数(如果不单步进入,list就看不到,不知道为什么?),在decoder_mbintra函数内部设置断点:
$list decoder_mbintra
$b 298
【8】continue到第二个断点处,出现如下提示:
(gdb)cannot access memory at address 0x80
【9】此时想打印该函数的局部变量stride,仍然提示
(gdb)cannot access memory at address 0x74

我在网络上搜索,有人说是library没有被load进来,我想如果没有被load进来,应该不可能单步进入这个文件,也不可能list出来,我将所有的断点disable,然后continue,可以完整的解码完整个序列,而且是正确的。

不知道有哪位大侠可以帮我看看这个问题,因为我需要进入到内部去调试,所以一定要能观察到程序运行时的变量值。

不知道有没有把这个问题说清楚,真诚希望有人帮助我,谢谢!
...全文
36832 6 打赏 收藏 转发到动态 举报
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
paokuflying 2021-06-28
  • 打赏
  • 举报
回复

重新编译下试试,有可能是可执行文件给错了。

chen1255 2010-12-16
  • 打赏
  • 举报
回复
你看一下是不是你的引用指针没有分配内存,所以gcc debugger 会报这个错误。按你说的能单步调试,证明是已经加载了
threeleafzerg007 2009-06-20
  • 打赏
  • 举报
回复
这也我也碰到过 正常

给你个网址

http://www.cs.berkeley.edu/~smcpeak/memory-errors/

Now I restart the program and attempt to set a hardware watchpoint:

(gdb) break main
Breakpoint 1 at 0x8048b91: file tmalloc.c, line 81.
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /home/scott/wrk/cplr/smbase/tmalloc

Breakpoint 1, main () at tmalloc.c:81
(gdb) watch *((int*)0x80508c6)
Cannot access memory at address 0x80508c6
(gdb)

Ok, the memory isn't mapped yet. Single-stepping through main a few times, I find a place where I can insert the watchpoint but the memory in question hasn't yet been trashed. When I then continue the program, the debugger next stops at the bug.

简而言之,这个线性地址 所在的区域 可能还没有映射到物理内存上
bxhsix 2009-06-20
  • 打赏
  • 举报
回复
有可能是你的程序或者你引用的库是32位,而你所使用的机器是64位的,如果是这样,那么你不能使用gdb,而应该使用gdb.32命令来进行调试。
zeloas 2008-01-24
  • 打赏
  • 举报
回复 1
可能是代码的有问题,也有可能是你运行不当。
问题可能是运行至此内存的地址不可访问,错误很早就犯下了,建议断点设的前一点。
kingwoo 2008-01-24
  • 打赏
  • 举报
回复
如果你没有lib的源码,理论上你是没法单步进入lib的。
你可以这样试试看
先用nm lib的名字查看xvid_decore的地址
然后
b *0x地址
或者地址偏移一些的位置
看会不会还出现cannot access
相关推荐

22,892

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告