Source和exe不同步:注释行似乎在gdb中调用函数
我是GDB调试的新手,在以下几点上遇到了困难:我需要知道何时调用函数endpage(),所以我使用Source和exe不同步:注释行似乎在gdb中调用函数,c,debugging,gdb,C,Debugging,Gdb,我是GDB调试的新手,在以下几点上遇到了困难:我需要知道何时调用函数endpage(),所以我使用 (gdb) b endpage 我运行程序,点击断点并查看调用堆栈: (gdb) bt #0 endpage () at ./szreptf.c:652 #1 0x0807ef91 in _repstr (s=0x80ac780 "") at mntrep.c:1818 #2 0x0807eef9 in repstr (s=0x80aa0f0 "") at mntrep.c:1798 [.
(gdb) b endpage
我运行程序,点击断点并查看调用堆栈:
(gdb) bt
#0 endpage () at ./szreptf.c:652
#1 0x0807ef91 in _repstr (s=0x80ac780 "") at mntrep.c:1818
#2 0x0807eef9 in repstr (s=0x80aa0f0 "") at mntrep.c:1798
[...]
#9 0x08052894 in main (argc=2, argv=0xbfb01994) at ./szmainf.c:514
这个函数的调用是一个注释行,并且是空的
(gdb) l mntrep.c:1818
1813 // extern int pdf_page_length; /* sydenham - imanage project */
1814 //#endif /*I_MANAGE_SITE*/
1815 //
1816 // if( !repcanwrite() )
1817 // return;
1818 //
1819 // if( keychst() == 'Q' && rep.pfquit != NULLFN)
1820 // (*rep.pfquit)(); // Calls endpage() in szreptf.c
1821 //
1822 // if( rep.on == 'C' )
这一行最初没有注释,但我尝试查看GDB是否查看了正确的文件,它是:我在该文件中所做的任何更改,我都可以使用l命令在GDB中看到它
但是由于某些原因,endpage()仍然是突然调用的,所以看起来GDB向我显示了一个不是我编译的文件
所以我的问题是:GDB如何决定调试时显示哪个文件?我认为这是从可执行文件推断出来的,但显然不是这样
有什么线索吗
提前感谢:)
编辑:我忘了提到它,但我将GDB附加到了一个正在运行的程序,我没有用GDB启动该程序。可执行文件中的调试信息不包括源代码本身,只包括filename:linenr对。因此,GDB将始终显示当前文件的外观,如果您在编译后修改源代码,则可能与编译后的代码不匹配。因此,GDB直接从可执行文件获得调用堆栈,但源代码来自我的工作目录?这是有道理的,只是我在运行之前编译了文件。我要编辑我的问题,我忘了提到我将GDB附加到一个已经运行的程序。在这种情况下,它是否已经运行没有任何区别。GDB总是从可执行文件中的调试信息获取源代码位置(而不是源代码本身)。