0

我有一个可执行文件需要调试。我在源文件的第 1653 行设置了断点。第 1653 到 1658 行包含一些声明。现在我开始运行程序。中断不是发生在第 1653 行。而是发生在第 1659 行。有人可以告诉我为什么以及如何解决它。

提前致谢.....

4

2 回答 2

2

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

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

如果你不能重新编译可执行文件,你将不得不使用你所拥有的。

于 2012-11-16T13:43:07.270 回答
1

正如unwind所暗示的,这可能是因为您的程序是使用优化构建的,但它也可能发生在未优化的构建中。编译器在调试信息中包含一个行表,该行表告诉调试器哪些源代码行导致了代码的生成。例如,

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 之后查找生成了一些代码的下一个源代码行,并将断点放在那里。

正如unwind所说,一旦编译器涉及优化,这个问题就会急剧恶化,因为源代码行可能会以您没有预料到的方式重新排列或完全省略(即使看起来像的源代码行肯定会导致生成一些代码。 .)。调试优化代码的最佳方法是混合源代码和汇编显示,并了解足够的汇编语言以在您逐步完成 IMO 程序时跟进。

于 2012-11-16T21:09:42.517 回答