Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Source和exe不同步:注释行似乎在gdb中调用函数_C_Debugging_Gdb - Fatal编程技术网

Source和exe不同步:注释行似乎在gdb中调用函数

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调试的新手,在以下几点上遇到了困难:我需要知道何时调用函数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
[...]
#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总是从可执行文件中的调试信息获取源代码位置(而不是源代码本身)。