【问题标题】:Program runs with gdb but doesn't run with ./ProgramName程序使用 gdb 运行,但不使用 ./ProgramName 运行
【发布时间】:2010-07-18 05:37:27
【问题描述】:

我正在 linux 中以汇编 64 位模式编写编辑器。当我在 GDB 中调试程序时它运行正常,但当我正常运行时它运行不正确,这意味着当我使用 ./programName 时它出现运行时错误。

【问题讨论】:

  • 请提供更多细节,或者我们是否应该开始猜测我们已经阅读/遇到的所有可能的错误? :)

标签: linux assembly gdb


【解决方案1】:

您可能正在访问未初始化的数据或存在某种内存损坏问题。这将解释程序在调试器中运行时的不同行为 - 您会看到未定义行为的结果。

通过valgrind 的memcheck 工具运行你的程序,看看它输出了什么。 Valgrind 是一个强大的工具,可以识别 Linux 上的许多运行时错误,包括对错误的完整堆栈跟踪。

【讨论】:

    【解决方案2】:

    如果 GDB 禁用 ASLR 是它工作的原因,也许 GDB 中的 set disable-randomization off 会让您在 GDB 中重现崩溃,以便您可以调试它。 Force gdb to load shared library at randomized address.

    否则,请从您的程序中启用核心转储,并在核心转储上使用 GDB。
    gdb ./prog core.1234。

    在 x86 上,您可以在您的 asm 源代码中插入一条 ud2 指令,以便在您希望在代码中的任何位置故意导致崩溃,如果您想在崩溃之前的某个时间点获得一个 coredump 来检查寄存器/内存在其自己的。所有架构都有一个未定义的指令可以使用,但我只知道 x86 的助记符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      相关资源
      最近更新 更多