Backtrace в GDB более ограничен в NASM, чем в C, но обычно я вижу этот тип backtrace в теле программы:
#0 set_data () at ProgramName.asm:863
#1 0x0000000000000000 in ?? ()
У меня есть двухъядерная программа (каждому назначенному ядру к другой задаче) и окончательные ошибки ядра на выходе (ret). В этот момент все, что я вижу с помощью bt (backtrace):
(gdb) bt
#0 0x0000000000000100 in ?? ()
#1 0x0000000000000000 in ?? ()
Это в NASM - я думаю, C покажет мне больше информации. Мой вопрос, как я могу увидеть больше информации для отладки segfault при выходе (ret) из программы. В моменте segfault другой поток (ядро) уже вышел, и это состояние потоков:
(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) работает с ошибками. БТ не раскрывает достаточно информации.
Один вопрос предполагал повреждение стека. В этой программе я храню некоторые переменные в стеке; Я начинаю с sub rsp, 64 и заканчиваю add rsp, 64, так что это должно заботиться о стеке, но это может иметь какое-то отношение к sefault при выходе и отсутствию информации о обратной трассировке.
Как я могу увидеть больше информации с помощью backtrace, где я вижу segfault при выходе из NASM?