在使用gdb运行exucatble时使用断点时会发生中断

时间:2012-11-16 13:41:31

标签: c gdb

我需要调试可执行文件。我已将断点放在源文件的第1653行。第1653至1658行包含一些声明。现在我开始运行该程序。在第1653行没有发生断裂。相反,它发生在第1659行。 有人可以告诉我为什么以及如何解决它。

提前致谢.....

2 个答案:

答案 0 :(得分:2)

您的代码可能不是为调试而构建的。如果使用优化编译它,则源代码行可能不再对应于生成的代码中的任何内容。

在没有任何优化的情况下构建它,并启用尽可能多的调试信息。如何做到这一点取决于编译器。

如果您无法重新编译可执行文件,那么您将不得不使用所拥有的内容。

答案 1 :(得分:1)

正如展开建议这可能是因为您的程序是使用优化构建的,但也可能是未经优化的构建。编译器在调试信息中包含行表,行表告诉调试器生成代码的源代码行。例如,

15 puts ("This probably resulted in some code being generated.");
16 
17 const int arrsize = 32;  // code generated?  Maybe, maybe not at -O0.
18 char buf[arrsize];       // code generated?  Unlikely.
19
20 // Now we'll start our real work...
21 
22 puts ("This probably resulted in some code being generated.");

第15或22行的断点可能会达到预期效果。但是完全有可能第16行到第21行导致没有生成代码,因此就调试器而言,这些行不存在。如果在第18行放置断点,调试器将在18之后查找生成一些代码的下一个源行,并将断点放在那里。

正如展开所说,一旦编译器涉及优化,这个问题就会急剧恶化,因为源代码行可能会以你没想到的方式重新排列或完全消除(甚至看起来像源代码行)喜欢肯定会导致生成一些代码..)。调试优化代码的最佳方法是使用混合源代码。当您逐步完成程序IMO时,程序集显示并了解足够的汇编语言。