2011-01-13 11 views
8

Possiedo un programma che intendo distribuire agli utenti finali e vorrei ricevere i rapporti di arresto anomalo da essi. Se usassi MSVC, genererei minidump e li invierei, quindi li ispezionerò con il PDB corrispondente per ottenere una traccia di stack utile, come minimo.equivalente GCC di PDB

Qual è l'equivalente di fare questo con GCC? Posso generare una traccia dello stack, ma se voglio che questo sia utile, richiede che i simboli di debug vengano compilati nell'eseguibile (con -g). Ovviamente questo è inaccettabile per la distribuzione del rilascio, dal momento che l'eseguibile può ingigantire un po 'di dimensioni.

Googled un po 'e ho trovato riferimenti a objcopy essere in grado di separare i simboli di debug in un file separato, ma quella pagina implicito avrei ancora bisogno di avere i simboli di debug disponibili a fianco l'eseguibile di rilascio, che è di nuovo ovviamente inaccettabile.

risposta

5

Impossibile trovare una risposta esatta a questo, ma ho trovato una soluzione alternativa che funziona altrettanto bene: compila con ottimizzazione e altri flag di rilascio a fianco -g, memorizza l'eseguibile risultante da qualche parte, quindi rimuovi i simboli di debug usando la striscia . Spedisci l'eseguibile stripped e quando ottieni una traccia stack, usa addr2line in combinazione con l'eseguibile originale, non intrecciato, e dovresti recuperare tutti i simboli.

6

Bene, l'idea è che si compili con -g per aggiungere i simboli di debug ma non rallentare il programma, ad es. la maggior parte dei programmi eseguirà -g -O2, quindi è possibile separare i simboli di debug con objdump. Dopodiché puoi creare strip in modo che non abbia alcun simbolo di debug.

Aggiornamento: gdb recente supporta i file di debug separati, vedi https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html

Per esempio è possibile doo

objcopy --only-keep-debug prog prog.debug 
strip prog 

ora i tuoi prog non avrà alcun simboli di debug. Ma puoi usare il file proc.debug per eseguirne il debug in gdb.

+0

Va bene, ma come faccio a riconciliare una traccia di stack generata senza simboli di debug (e quindi contenente solo indirizzi) con i simboli di debug separati in seguito, per ottenere una traccia di stack che posso effettivamente leggere? – pjohansson

+0

gdb può impostare l'uso di simboli di debug separati, questo è il modo in cui le distribuzioni Linux abilitano il debug, vedere http://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html – ismail

+2

Questa pagina sembra anche dare per scontato che le informazioni di debug è presente sul computer dove si manifesta l'errore. Chiarirò: non possiamo spedire le informazioni di debug ai nostri clienti. È necessario che il software generi una traccia di stack (senza simboli di debug) e che questa traccia di stack sia riconciliata con simboli di debug separati su uno dei nostri computer di sviluppo qui in una fase successiva, senza ulteriore coinvolgimento da parte del client. Dovrei forse anche chiarire che questo è un ambiente Windows, non uno * nix. – pjohansson

Problemi correlati