трудности со списком потоков/стеков с помощью GDB на ARM

Я использую GNUEABI для удаленной отладки устройства ARM, я могу устанавливать точки останова, шаг, просматривать память и т. д.

... в целом жизнь удалась

однако при произвольном прерывании, а затем набираю «информационные потоки», я получаю список потоков, но символы не разрешаются

Например

(gdb) info threads
  7 Thread 10283  0x402a42a4 in ?? ()
  6 Thread 10282  0x402a42a4 in ?? ()
  5 Thread 10281  0x401c9d68 in ?? ()
  4 Thread 10280  0x401c9d68 in ?? ()
  3 Thread 10279  0x401cb3f4 in ?? ()
 *2 Thread 10278  0x401cb294 in ?? ()
  1 Thread 10195  0x0001c5e0 in ?? ()

если бы я установил точку останова, а затем ждал, пока она затронет все потоки, но тот, у которого есть точка останова, был бы таким, как указано выше, но поток с точкой останова разрешится

если я попытаюсь изучить обратную трассировку одного из этих потоков, я увижу что-то вроде этого

(gdb) bt
#0  0x003d0f00 in ?? ()
#1  0x0000027f in ?? ()
#2  0x00000277 in ?? ()
#3  0x4360c4e0 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)

ПРИМЕЧАНИЕ: я не думаю, что стек поврежден, скорее я думаю, что gdb думает, что стек поврежден, что связано с проблемой и, вероятно, подсказкой?

идеи? - имейте в виду, когда точка останова попадает в стек вызовов, он выглядит великолепно.


person stuck    schedule 28.08.2011    source источник
comment
Взгляните на /proc/‹pid›/maps, чтобы убедиться, что эти адреса находятся в файлах, которые вы ожидаете. Если вы используете ›O0, есть ли у вас указатель -fno-omit-frame-pointer? (и может быть -mapcs-frame)   -  person auselen    schedule 18.09.2012
comment
Интересно, правильно ли вы используете libthread_db?   -  person John Szakmeister    schedule 22.09.2012


Ответы (1)


Есть ли у вас причина ожидать, что эти потоки будут выполнять ваш код? Довольно часто потоки выполняют библиотечный код или находятся в спящем режиме, и в любом случае они не выполняют ваш код. Однако, когда вы устанавливаете точку останова в своем коде, она срабатывает только тогда, когда этот поток фактически запускает ваш код.

Могу поспорить, что вы увидите часть своего кода на некоторых трассировках стека. Проверьте это; это будет поучительно.

person MSalters    schedule 06.09.2011
comment
Я не вижу кода в трассировках, если только я не наткнулся на точку останова - в этот момент все выглядит хорошо. Я обновил сообщение выше, чтобы прояснить - person stuck; 18.09.2012