【问题标题】:GDB does not break on some lines of code when using multiple source files使用多个源文件时,GDB 不会中断某些代码行
【发布时间】:2013-08-05 20:56:31
【问题描述】:

我有一个程序,我想通过在非默认构造函数中设置断点来进行调试,但我设置的断点从未命中。下面是一个出现此问题的示例程序。在 main 函数中设置断点没有问题,但在 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;
}

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

Why does Eclipse CDT ignore breakpoints?

我正在使用:

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

请耐心等待。我还在学习中。

【问题讨论】:

  • 我在使用 gdb(以及其他......)时总是遇到这个问题,即使在命令行中也是如此。你可以使用 Visual Studio(它有更好的调试器)。
  • 我更喜欢坚持使用 GNU 工具,因为我正在研究跨平台解决方案,并且我更喜欢尽可能使用免费(在所有意义上的)工具。
  • 我在其他场合看到过 GDB 跳过行,但从来没有这样。再说一次,我没有运行“Apple”。

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


【解决方案1】:

你很可能会点击这个 GDB bug

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

【讨论】:

  • 是的......这就是问题所在。我不敢相信苹果根本没有更新这个。我尝试安装 GDB 的 macports 版本,但遇到了各种代码签名问题。最终我放弃了在 Mac 上进行开发的尝试,转而使用 Ubuntu。
【解决方案2】:

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

【讨论】:

  • 这更适合作为对原始问题的评论而不是答案。话虽如此,我使用其他调试/优化选项并没有取得多大成功。如果您发现了什么,请告诉我。
猜你喜欢
  • 1970-01-01
  • 2017-12-05
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 2023-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多