当前位置: 技术问答>linux和unix
100分!奇怪的gdb断点问题
来源: 互联网 发布时间:2016-07-15
本文导语: 我用gdb6.5在rhel上编译并调试一段程序 prob.c,没问题, 但在aix上6.0编译同样的程序成功后,gdb prob然后 b main,可是断点却跑到了 /opt/freeware/lib/gcc/powerpc-ibm-aix5.3.0.0/4.2.0/include/stdlib.h, line 185.这个地方。...
我用gdb6.5在rhel上编译并调试一段程序 prob.c,没问题,
但在aix上6.0编译同样的程序成功后,gdb prob然后 b main,可是断点却跑到了
/opt/freeware/lib/gcc/powerpc-ibm-aix5.3.0.0/4.2.0/include/stdlib.h, line 185.这个地方。
aix上的make写的应该没有问题,因为其它模块的程序使用的同样的编译参数,都没有这个问题。
更奇怪的是我将prob.c中的一个无关紧要的行去掉后,这个问题竟然消失了:strcpy(strSubjTot.subj_id,"12345");
而这段代码肯定是没有问题的,它在rhel上跑是对的。
请诸位高手指教!
但在aix上6.0编译同样的程序成功后,gdb prob然后 b main,可是断点却跑到了
/opt/freeware/lib/gcc/powerpc-ibm-aix5.3.0.0/4.2.0/include/stdlib.h, line 185.这个地方。
aix上的make写的应该没有问题,因为其它模块的程序使用的同样的编译参数,都没有这个问题。
更奇怪的是我将prob.c中的一个无关紧要的行去掉后,这个问题竟然消失了:strcpy(strSubjTot.subj_id,"12345");
而这段代码肯定是没有问题的,它在rhel上跑是对的。
请诸位高手指教!
|
objdump -D看看main附近的代码对不对吧。
gdb从符号表哪到各个函数的位置信息,假设它没有问题的话,那么应该是符号表出了问题。
一般不会有这种情况,我怀疑aix上的ld的默认脚本有问题。(在没有指定具体的脚本时,ld调用一个默认的脚本。)
objdump -D把程序反汇编出来,分别看看有strcpy跟没strcpy两种情况下,main的不同之处(比如所在的地址)。
另外,可以先尝试在aix上运行你的程序,如果你能得到正确的结果,那么ld也应该没问题,问题可能是出在gdb。
gdb从符号表哪到各个函数的位置信息,假设它没有问题的话,那么应该是符号表出了问题。
一般不会有这种情况,我怀疑aix上的ld的默认脚本有问题。(在没有指定具体的脚本时,ld调用一个默认的脚本。)
objdump -D把程序反汇编出来,分别看看有strcpy跟没strcpy两种情况下,main的不同之处(比如所在的地址)。
另外,可以先尝试在aix上运行你的程序,如果你能得到正确的结果,那么ld也应该没问题,问题可能是出在gdb。
|
strcpy(strSubjTot.subj_id,"12345");
我咋也怀疑这句话有问题呢?
一般断点混乱,可能就是栈乱了。应该是BUG,指针问题在不同地方反映出来的现象是很多。我经常遇到内存越界的问题,在这台机器次次能浮现,而在另外人的机器上就不一定了。
我咋也怀疑这句话有问题呢?
一般断点混乱,可能就是栈乱了。应该是BUG,指针问题在不同地方反映出来的现象是很多。我经常遇到内存越界的问题,在这台机器次次能浮现,而在另外人的机器上就不一定了。
|
把出错时的堆栈打印出来,检查一下这之前到那个函数, 可能是 给 atoi 之类到函数传了一个空指针或者非法指针了。