在GDB中:在启动程序中以代码1退出.在GDB之外运行良好

In gdb: During startup program exited with code 1. Runs fine outside of GDB

本文关键字:GDB 退出 运行 代码 启动 程序      更新时间:2023-10-16

我有一个程序,该程序与debug标志一起编译,在我正常执行时运行良好,但不会在GDB中运行。

这是我所看到的摘要:

gdb --args myProgram various arguments
//some standard gdb output stuff here
run
Starting Program: /full/path/to/my/executable/myProgram various arguments
During startup program exited with code 1

我相信"在启动期间"部分意味着该程序在呼叫Main之前已退出,但是到目前为止,我尚未弄清楚在失败之前设置断点。

我尝试的东西

  • 我验证了GDB输出我的可执行文件的路径是正确的
  • b main-与以前相同的输出
  • b _start-与以前相同的输出
  • b _init-与以前相同的输出
  • b exit-与以前相同的输出
  • catch syscall exit_group-与以前相同的输出
  • starti-没有这样的命令,因为我的gdb太老了
  • set disable-aslr on-没有这样的符号(在这一点上,这有点绝望,我不知道ASLR是否在此中发挥作用(
  • set stop-on-solib-events 1-相同的输出
  • catch load-未定义的捕获命令
  • break *0-(此答案的nifty hack(与以前相同(加上有关无效地址的消息(
  • info file-要查看入口点地址,它与_start
  • 是相同的地址
  • b std::terminate-找不到符号
  • 我查看了很多其他堆栈交换问题,但不幸的是我没有跟踪所有问题,所以我无法在这里列出所有内容。

我真的不想尝试

我知道的唯一发生在主要之前的事情是初始化了静态存储的变量。因此,我想我能采取的方法是尝试识别所有初始化静态变量并在那里设置断点的地方。但是,这是一个大型代码库,取决于许多共享库,其中很多都非常凌乱,因为其中很多是在编码标准截然不同的80年代写的。我真的不想挖掘所有这些,尤其是因为我信心很低,因为它实际上会帮助我。

我有一些一般问题

也许我什至不应该专注于在程序退出之前尝试设置断点。也许还有另一种方法可以弄清楚(甚至猜测(是什么原因导致它退出。

在GDB中与该程序在命令行中正常运行的方式之间运行程序之间有什么区别?

当程序在GDB之外运行良好时,有什么常见原因是什么原因?

GDB是否有可能在尝试启动我的程序之前报告此问题?还是它实际上是启动它,而我所有的休息尝试都没有工作?

您可能需要查看https://sourceware.org/gdb/onlinedocs/gdb/starting.html,以获取GDB下开始过程的详细信息。它可能涉及外壳或某些包装器过程,您引用的错误消息指示该外壳/包装器在执行您的实际二进制文件之前的退出。例如,如果您使用sudo在系统帐户下启动GDB,其外壳设置为/bin/false ,则将参数传递给您不 set startup-with-shell off,GDB将尝试要使用/bin/false将参数传递给您的二进制文件,这自然会失败,您将获得所引用的确切消息而不是执行程序。

我相信"在启动期间"部分意味着该程序在调用main

之前已退出

您必须在Windows上(值得一提

否:这意味着该程序在完成初始化之前已接收到EXIT_PROCESS_DEBUG_EVENT。通常,这意味着kernel32.dll不喜欢设置此过程的方式,甚至没有A程序的单指令运行。

您可以使用set debugevents 1的GDB获得其他调试帮助。

[已解决]涉及重定向的特殊情况。

我在使用代码130退出的启动计划中获得了"启动"。当我 ^c运行后的i ^c时,

是的,我有"处理Sigint Pass nostop Noprint"在我的.gdbinit中,我可以打破程序,好像在调试器中没有运行。

事实证明我没有中断正确的程序。

i ran'gdb a.out''设置一个断点,然后'r [args] 2>& 1>T恤输出。因为我想立即查看Stdout/stderr输出,但也想在输出中捕获它。log以防万一它开始流式传输错误并覆盖我的终端滚动buffer。

当我击中 ^C时,我正在向T恤发送SIGINT,而不是在GDB中运行的程序。

当我用简单的-r [args] 2>output.log&quot并做了" tail -f output.log"。在另一个窗口中,我的 ^c将sigint发送到我的程序,我优雅地退出了。