[GDB中的Backtrace在NASM中比在C中更受限制,但是通常我在程序主体中看到这种类型的backtrace:
#0 set_data () at ProgramName.asm:863
#1 0x0000000000000000 in ?? ()
我有一个两核程序(每个核都分配给一个不同的任务),并且在退出时(退出)有最后一个核段。到那时,我看到的所有bt(backtrace)都是:
(gdb) bt
#0 0x0000000000000100 in ?? ()
#1 0x0000000000000000 in ?? ()
那是在NASM中-我想C会给我显示更多信息。我的问题是,我如何查看更多信息以在程序退出(退出)时调试段错误。在段故障发生时,另一个线程(核心)已经退出,这是线程的状态:
(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退出时在段隔离中查看回溯的更多信息?
我需要查看线程3(0x7fffea724700)segfaults的位置。
$rip
的值为0x100
时发生段错误。 如何代码最终在没有MCVE的情况下无法确定。
在程序退出(退出)时调试段错误。
Exit和ret(urn)是不一样的东西。创建任务时没有任务,您是否要返回呼叫者?