2

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

主要.cpp:

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

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

域.cpp:

#include "Domain.h"

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

域.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 运行它时,断点都不起作用,在那里我得到了这个问题中讨论的相同错误,但显然从未得到回答:

为什么 Eclipse CDT 忽略断点?

我在用:

  • 日食开普勒
  • Mac OSX 10.8.4
  • gdb 6.3.5(苹果版)
  • -O0带有和-g3标志的 gcc 4.2.1

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

4

2 回答 2

2

您可能遇到了这个 GDB错误

这个 bug 早就修复了,但是你的 GDB 版本太旧了(Apple不太可能更新它)。

于 2013-08-06T03:06:47.880 回答
0

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

于 2013-08-05T21:21:58.853 回答