【发布时间】: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