一般Release給客戶的檔案都是移掉Debug資訊的檔案,不過,在編譯Release檔案時,通常會額外編譯一份具有Debug Symbol的檔案,而在Debug時,雖然可以在GDB動態載入Debug Symbol,不過,還是不方便,其實elfutils提供一個好用的工具eu-unstrip,它可以把Debug Symbol塞回原本ELF檔案
main.c
#include <stdio.h> int main(int argc, char** argv) { printf("testing\n"); return 0; }
編譯
$ gcc main.c -o main $ gcc main.c -ggdb -o main.debug
模擬Release Build
$ strip main $ file main main: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=44edbb6ef58938fde04de6b6943a640edeb37b77, stripped
Unstrip
$ eu-unstrip -f main main.debug -o test $ mv test main $ file main main: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=44edbb6ef58938fde04de6b6943a640edeb37b77, with debug_info, not stripped
Debug
$ gdb main (gdb) b main Breakpoint 1 at 0x1114: file main.c, line 5. (gdb) r Starting program: /home/steward/Downloads/main Program received signal SIGSEGV, Segmentation fault. 0x0000000000000001 in ?? () (gdb) list 1 #include <stdio.h> 2 3 int main(int argc, char** argv) 4 { 5 printf("testing\n"); 6 return 0; 7 }