GDB, как получить трассировку при выходе в NASM? - PullRequest
0 голосов
/ 16 апреля 2020

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?

1 Ответ

1 голос
/ 16 апреля 2020

Мне нужно увидеть, где поток 3 (0x7fffea724700) работает с ошибками.

Это происходит с ошибкой, когда $rip получает значение 0x100. Как код заканчивается там, что мы не можем сказать без MCVE .

отладка ошибки при выходе (ret) из программы.

Exit и ret (urn) - это не одно и то же. Вы возвращаетесь к своему абоненту, когда задача была создана без таковой?

...