使用多个源文件时,GDB不会破坏某些代码行

时间:2013-08-05 20:56:31

标签: c++ eclipse gcc gdb eclipse-cdt

我有一个程序,我想通过在非默认构造函数中设置断点来调试,但我设置的断点永远不会被命中。下面是一个示例程序,出现此问题。命中主函数中设置的断点没有问题,但忽略了Domain.cpp文件中设置的任何断点:

Main.cpp的:

#include <iostream>
#include "Domain.h"

int main()
{
  Domain y;
  std::cout << y.x << std::endl;  // <- No problem setting breakpoint here
  return 0;
}

Domain.cpp:

#include "Domain.h"

Domain::Domain()
{
  x = 4;  // <- A breakpoint here is skipped
}

Domain.h:

#ifndef DOMAIN_H_
#define DOMAIN_H_

class Domain
{
public:
  int x;
public:
  Domain();
};

#endif /* DOMAIN_H_ */

但是,如果我将所有内容都放在一个文件中,则问题不存在:

Main2.cpp:

#include <iostream>

int main()
{

  class Domain
  {
  public:
    int x;
    Domain()
    {
      x = 4;  // <- No problem setting breakpoint here now!
    };

  };

  Domain y;

  std::cout << y.x << std::endl;

  return 0;
}

为什么会这样?如何更改此设置,以便在使用多个文件时能够设置断点?

我可以确认,当我在终端中手动运行调试器以及通过Eclipse CDT运行调试器时,断点都不起作用,我在这个问题中讨论了相同的错误,显然从未回答过:

Why does Eclipse CDT ignore breakpoints?

我正在使用:

  • Eclipse Kepler
  • Mac OSX 10.8.4
  • gdb 6.3.5(Apple版)
  • 带有-O0-g3标志的gcc 4.2.1

请耐心等待我。我还在学习绳索。

2 个答案:

答案 0 :(得分:2)

您可能正在点击此GDB bug

这个bug早已修复,但您的GDB版本非常旧版(Apple不太可能更新它)。

答案 1 :(得分:0)

这是一个非常有趣的异常,我想进一步探讨,但我怀疑它与Eclipse的默认GCC设置有关。许多超级基本函数在它们点击编译器时会得到优化。 (有一次我试图跟踪一个简单的for循环,但完全取消了GCC的最高优化设置)