我试图弄清楚为什么gdb的行为不符合预期。不知道是什么触发了这一点。看到此问题后,我编写了main函数的最小版本。它完成了最后一行并正确退出。添加了另一个功能后,跳转又回来了。即使在注释掉添加的行之后,跳回也不会消失。
即使在注释掉大部分代码(不是我自己的库的单行引用)之后,我不确定这是否与链接到我自己的库有关,构建过程仍然使用链接(automake):
LDADD = ../libmyown.la
此行用于将库添加到此目录中内置的许多其他程序中。我测试了gdb和gcc的不同版本,两个程序的最新版本均为8.2。使用了-g -O0,-ggdb -O0选项。我已经在Stackoverflow中看到有关此类行为的帖子。不知道我是否遇到了这种现象,或者是我自己的库中的某些错误导致了这种回跳行为,而该错误导致了其链接。尽管此发布似乎多余,但我尝试提供更多上下文信息。希望我自己的其他人能够找到解决方案并为他人提供帮助。
除了gdb中的跳转问题外,二进制程序都可以正确执行。
以下是主体的略微扩展版本,显示了跳跃问题:
Breakpoint 1, main (argc=1, argv=0x7fffffffdeb8) at alnlocalmany.cpp:66
66 if (isDNA(reffile)) {
(gdb) n
67 alignDNAMany(reffile, dbfile, outfile);
(gdb)
68 return 0;
(gdb) s
39 string reffile, dbfile, outfile;
(gdb) s
73 }
(gdb) s
0x00007ffff6d97b97 in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) s
Single stepping until exit from function __libc_start_main,
which has no line number information.
[Inferior 1 (process 15621) exited normally]
请注意,它从68跳到39(main的第一行),然后跳到73(main的大括号结尾)
答案 0 :(得分:2)
过去有一个类似的gcc bug 49951,后来以状态RESOLVED FIXED关闭。但是,可以使用当前版本的gcc进行复制(我已经使用gcc 8.2.1进行了测试)。其他人还声称该错误未修复,请参见https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49951#c20。
作为一种解决方法,您可以尝试使用clang代替gcc,至少在使用clang进行构建时,gcc bug 49951的测试示例未重现该错误。您还可以将gcc降级到4.4版,但现在太旧了。