GDB调试,遭遇“cannot access memory at address”
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,可以完整的解码完整个序列,而且是正确的。
不知道有哪位大侠可以帮我看看这个问题,因为我需要进入到内部去调试,所以一定要能观察到程序运行时的变量值。
不知道有没有把这个问题说清楚,真诚希望有人帮助我,谢谢!