Jak na výpis stacku při chybě?

prezek

  • ***
  • 229
    • Zobrazit profil
Jak na výpis stacku při chybě?
« kdy: 27. 04. 2013, 11:29:33 »
Na desce s ARMem mi běží Linux a občas se mi objeví chyba segmentace, tak bych si chtěl pořídit její výpis. Na PC mi funguje toto:
Kód: [Vybrat]
#include <execinfo.h>
void show_stackframe() {       
    void *trace[16];
    char **messages = (char **) NULL;
    int i, trace_size = 0;
    trace_size = backtrace(trace, 16);
    messages = backtrace_symbols(trace, trace_size);
    printf("[bt] Execution path:\n");
    for (i = 0; i < trace_size; ++i)
        printf("[bt] %s\n", messages[i]);
}
Vypišou se mi názvy funkcí s posledními spuštěnými řádky, které vedly až k výpisu, ale na té desce to vypíše pouze:
Kód: [Vybrat]
[bt] Execution path:
[bt] /lib/ld-linux.so.3 [0x40025000]
Pro ARM kompiluju pomocí Sourcery_CodeBench_Lite_for_ARM_GNU_Linux ve  Windows XP
Kód: [Vybrat]
arm-none-linux-gnueabi-gcc -c -Wall -Werror -pg -g -rdynamic  -funwind-tables  -I./inc -I./include ... -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_REENTRANT -D_LINUX_ -o main.o main.c
arm-none-linux-gnueabi-gcc -pg -rdynamic  -funwind-tables  -o prog2 main.o graphic.o ... -lpthread -lrt -lfreetype -lm
Co dělám špatně?


Sten

Re:Jak na výpis stacku při chybě?
« Odpověď #1 kdy: 27. 04. 2013, 13:50:46 »
Zkusil bych ještě -fno-omit-frame-pointer

Jinak to děláš v handleru SIGSEGV? Pravděpodobně jsou tam signály spouštěné v jiném vlákně (sigaltstack) nebo je rozbitý stack. Já jsem tohle řešil tak, že jsem v SIGSEGV handleru na sebe spustil gdbserver.

gamer

Re:Jak na výpis stacku při chybě?
« Odpověď #2 kdy: 27. 04. 2013, 14:44:25 »
Nebylo by jednodušší pořídit coredump a potom se na to podívat pod gdb? Jinak jestli má ta deska dost RAM, pustil bych to pod valgrindem, většinou řekne chybu dřív, než to opravdu spadne.

prezek

  • ***
  • 229
    • Zobrazit profil
Re:Jak na výpis stacku při chybě?
« Odpověď #3 kdy: 16. 05. 2013, 08:33:49 »
Nějak jsem pozapomněl poděkovat, tak díky oběma. "-fno-omit-frame-pointer" jsem zkoušel, ale bez úspěchu. "coredump" ale vypadá jako ideální řešení. Ještě by bylo fajn, kdyby se podařilo dostat výsledek do NetBeans, Code:Blocks, nebo něčeho podobného.