【问题标题】:GDB how to get backtrace on exit in NASM?GDB如何在NASM退出时获得回溯?
【发布时间】:2020-04-15 22:44:21
【问题描述】:

在 GDB 中的回溯在 NASM 中比在 C 中更受限制,但通常我会在程序主体中看到这种类型的回溯:

#0  set_data () at ProgramName.asm:863
#1  0x0000000000000000 in ?? ()

我有一个双核程序(每个核分配给不同的任务)和退出(ret)时的最终核心段错误。那时我看到的所有 bt (回溯)是:

(gdb) bt
#0  0x0000000000000100 in ?? ()
#1  0x0000000000000000 in ?? ()

那是在 NASM 中——我想 C 会向我展示更多信息。我的问题是,如何查看更多信息以在程序退出(ret)时调试段错误。在发生段错误时,另一个线程(核心)已经退出,这是线程的状态:

(gdb) info threads
  Id   Target Id         Frame
  1    Thread 0x7ffff7fea740 (LWP 22160) "Call_Create_Thr"  0x00007ffff6ff3d2d in __GI___pthread_timedjoin_ex   (threadid=140737126745856, thread_return=0x0,
    abstime=0x0, block=<optimized out>) at  pthread_join_common.c:89

* 3    Thread 0x7fffea724700 (LWP 22165) "Call_Create_Thr"  0x0000000000000100 in ?? ()

我需要查看线程 3 (0x7fffea724700) 的段错误。 bt 没有透露足够的信息。

一个问题表明堆栈损坏。在这个程序中,我将一些变量存储在堆栈中;我从 sub rsp,64 开始并以 add rsp,64 结束,这样应该会处理堆栈,但这可能与退出时的错误和缺少回溯信息有关。

如何通过回溯查看我在 NASM 中退出时出现段错误的更多信息?

【问题讨论】:

  • 感谢您的回复。我没有在这个问题上发布 mcve,因为它只是关于如何使用 gdb 查看更多信息。我必须自己调试问题,因为它是一个复杂的程序,有两个核心做不同的事情,数据存储在堆栈中。

标签: segmentation-fault gdb nasm


【解决方案1】:

我需要查看线程 3 (0x7fffea724700) 段错误的位置。

$rip 获得0x100 的值时,它会出现段错误。 代码如何没有MCVE,我们无法判断。

在程序退出(ret)时调试段错误。

Exit 和 ret(urn) 不是一回事。当任务在没有人的情况下创建时,您是否返回给调用者?

【讨论】:

    猜你喜欢
    • 2012-06-25
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    相关资源
    最近更新 更多