【问题标题】:During startup program exited normally. gdb doesn't break at breakpoints在启动程序正常退出。 gdb 不会在断点处中断
【发布时间】:2020-10-09 14:06:52
【问题描述】:

我在尝试使用 gdb 调试任何程序的任何代码上都收到此 gdb 错误。这是重现错误的最简单过程

  1. 使用以下内容创建一个main.cpp 文件:
int main(){
    return 0;
}
  1. 运行g++ -g main.cpp
  2. 运行gdb a.out
  3. 在 gdb 内部使用break 2 在第 2 行设置断点
  4. 在 gdb 中使用run 运行程序

输出:

Starting program: /tmp/test/a.out 
During startup program exited normally.

这一切都是在命令行上使用 gdb 完成的。我尝试使用 g++ 和 gcc 得到相同的结果。我真的不确定从这里去哪里。

  • gdb 版本 = 9.2
  • g++ 版本 = 9.3.0

编辑:我找出了导致问题的原因,但不知道如何解决它。这个问题似乎与我的 SHELL 变量有关。我目前使用xonsh 作为我的shell,但是当我将SHELL 环境变量设置回/bin/bash 时,一切都按预期工作。使用 xonsh 时我能做些什么来解决这个问题?我应该向 xonsh、gdb 报告,还是两者都不报告?

【问题讨论】:

  • 运行前没有当前源文件,break 2 不起作用。你应该得到一个警告。
  • @S.M.不要认为那是真的。在加载二进制文件之后但在运行它之前设置这样的断点是很常见的。好吧,至少它可以在我的机器上运行。

标签: c++ c gdb


【解决方案1】:

我目前使用 xonsh 作为我的 shell,但是当我将我的 SHELL 环境变量设置回 /bin/bash 时,一切都按预期工作。使用 xonsh 时我能做些什么来解决这个问题?我应该向 xonsh、gdb 报告,还是两者都不报告?

这可能是您的xonsh 启动问题,也可能是xonsh 问题,也可能是xonsh 没有按照GDB 的预期进行。

通常,GDB forks / execs $SHELL -c "/path/to/your/exe $args" 并期望您的程序将 $SHELLexec(这样做是为了使 shell 重定向在 GDB 下仍然有效)。

只有之后 exec 才会开始设置断点等。

如果你有一些 xonsh 初始化文件,例如导致xonshexec 的其他原因,事情可能会变糟。所以我建议尝试删除任何这样的~/.xonshrc 或任何它被称为文件的东西,看看是否能解决问题。

如果不是,则可能是 xonsh,例如forks 和 execs 你的二进制文件在一个孩子(GDB 的孙子)而不是直接做,或者可能是 xonsh 不理解 -c ... 语法。


如果您不关心重定向,您也可以要求 GDB 根本不使用 $SHELLset startup-with-shell offDocumentation.

【讨论】:

    猜你喜欢
    • 2013-07-20
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 2016-06-07
    • 2020-12-30
    • 1970-01-01
    • 2017-06-07
    • 2018-03-12
    相关资源
    最近更新 更多