2012-06-04 3 views
3

Я следил за этим сообщением, чтобы распечатать трассировку стека How to generate a stacktrace when my gcc C++ app crashes. Он хорошо работает в x86 linux. Может ли кто-нибудь научить меня, как заставить его работать на arm-linux?print trace trace в arm-linux

Я использую arm-linux-gcc 4.4.3.

[[email protected] /]# ./test1 
Error: signal 11: 
[0x0] 

в x86

[email protected]:~/Desktop/workspace/test/testCatchSeg/src$ ./test1 
Error: signal 11: 
./test1(_Z7handleri+0x19)[0x804876d] 
[0xedd400] 
./test1(_Z3bazv+0x10)[0x80487c2] 
./test1(_Z3barv+0xb)[0x80487e1] 
./test1(_Z3foov+0xb)[0x80487ee] 
./test1(main+0x22)[0x8048812] 
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x84de37] 
./test1[0x80486c1] 

Это, как я составляю для ARM-Linux

arm-linux-g++ -g -rdynamic ./testCatchSeg.cpp -o testCatchSeg 
+0

Можете ли вы опубликовать командную строку gcc для компиляции ARM? Вы не случайно пытаетесь запустить двоичный код x86 в целевой ARM, не так ли? –

ответ

5

ARM не хранит адрес возврата в стеке, когда разветвление в подпрограмму, а скорее ожидает любая функция вызывает подпрограммы, чтобы сохранить регистр ссылок в свой собственный стек стека перед вызовом других функций, поэтому невозможно следить за кадрами стека с помощью hout отладочная информация.

+0

Это не означает, что нет никакой полезной информации, потенциально доступной, хотя. Например, поскольку андроид обеспечивает возможность сбоя прикладных процессов, дамп текущего значения регистра ссылок и последние несколько значений в стеке могут предоставить ключи для квалифицированной интерпретации людей - вы не знаете, что все эти значения являются адресами, но среди них должны быть обратные адреса вызова стека. Это еще более полезно, если эти значения автоматически коррелируются как потенциальные адреса в сопоставлениях исполняемых/библиотек и любые идентифицируемые символы в нем. –

+0

Можете ли вы научить, как получить больше отладочной информации? Моя цель - ошибка сегментации отладки. Я не знаком с дампом или реестром ссылок. – Mickey

+0

Лучший способ - подключить отладчик, например gdb, при запуске программы; таким образом, SIGSEGV доставляется в отладчик, а программа заморожена прямо в незаконном доступе. Затем отладчик может посмотреть инструкцию о сбоях и перевести ее обратно в исходную строку, а также просмотреть информацию об использовании регистров и стека в этой точке в отладочной информации, которая достаточна для создания трассировки стека. –

4

Я только что получил backtrace() для работы с GCC для ARM. Ключ для меня заключался в компиляции с -funwind-tables. В противном случае глубина стека всегда была 1 (т. Е. Пустая).

+0

Вы хотите сказать, что я добавляю флаг funwind-tables при компиляции моей программы? – Mickey

+0

Да, передайте флаг -funwind-tables в gcc при компиляции. – jfritz42