# [AIdrifter CS 浮生筆錄](https://hackmd.io/bKL1LVo8RaCKn02uHJW2BA#) :<br> Debug Hacks <br> Ch2 : Debug前該知道的事 - 介紹debuger(GDB), intel 架構, stack, function argument 運作方式。 ## Process Core Dump ### Get Process core dump - 啟用linux core dump 機制 ```bash # unlimited ulimit -c unlimited # bytes size ulimit -c 1234567 ``` - 故意寫 coredump file code ```C #include <stdio.h> #include <stdlib.h> int main() { int *a = NULL; *a = 0x1; return 0; } ``` - 透過core dump file除錯 ```shell gcc -g main.c gdb -c core ./a.out ``` - gdb show information ```gdb [New LWP 20545] Core was generated by `./a.out'. Program terminated with signal SIGSEGV, Segmentation fault. #0 0x000055d3dff72670 in main () at main.c:12 12 *a = 0x1; ``` ### 產生目錄專用的coredump file ```shell # case 1 cat /etc/sysctl.conf kernel.core_pattern = /tmp/cores/core.%e.%p.%h.%t kernel.core_user_pid = 0 # case 2 : use pipe to compress core dump file cat /proc/sys/kernel/core_pattern |/usr/share/apport/apport %p %s %c %d %P ## Absolute path mkdir /tmp/cores/ echo "/tmp/cores/core.%e.%p.%h.%t" > /proc/sys/kernel/core_pattern ## relative path echo "core.%e.%p.%t" > /proc/sys/kernel/core_pattern ``` ### 利用Core Dump Masking 跳過共享記憶體範圍 - 在多process情境下 core dump檔案要如何進行設定為佳? ```shell root@aidrifter-VM /p/4900# cat coredump_filter 00000033 ``` ### 利用core dump file debug ``` gdb a.out gdb) set solib-absolute-prefix symbols gdb) core core.xxxxx gdb) bt ``` ## How to use GDB (I) ### 加入 -g 參數去debug - `Werror` : 把warnning 視為錯誤 - `O2` : optimize - inline functino會被自動展開,symbol table不會記載該function - local變數被放到register內,gdb無法顯示該local變數的值 - 作者不建議拿掉`-O`,因為不好mantain,最少要知道怎樣去最佳化的過程。 ```shell # gcc gcc -Wall -O2 -g *.c # makefile CFLAGS = -Wall -O2 -g # confiure ./configure CFLAGS="-Wall -O2 -g" ``` ### b : Break Point - `b` 設定中斷點 ```shell # function b main # file and line number b main.c:123 # file and function b test.c:foo ``` ### r : run program - `r` run program ### info : show information ```shell # sholl all break points info break info b # delete break point or watch point delete 3 # show stack frame info s # show registers info reg ``` ### bt : back trace - `bt` show backtrace ```shell # show 3 frame and their local variable bt full -3 ``` ### p : printf ```shell p argv p *argv p argv[0] # hex p/x local_var # printf register eax p $eax # printf program counter <=> p $eip p $pc ``` ### x : x/NFU ADDR - ADDR : address - N : 重複次數 - F : 前面格式字元 ```shell # disassemble pc's command x/i $pc 0x8048ebd <main+173> cmp $0x6e,%eax # disassemble pc's list 10 command x/i $pc 0x8048ebd <main+173> cmp $0x6e,%eax 0x8048ec0 0x8048ec6 0x8048ecc 0x8048ecf ... ``` ### disassem : 反組譯 ```shell # dissassemble $pc ~ $pc+50 disassem $pc $pc+50 ```` ### n : next 逐步執行 ### c : continue到中斷點 or signal ### wathc : watch point ```shell watch awatch rwatch ``` ### set variable : change bariable ```shell set variable options = 0 print options ``` ### 產生core file - 為正在debug的process產生core file ```shell # generate core dump file generate-core-file # Get core file without terminating process status gcore `pidof emcas` ``` ## How to use GDB (II) ### gdb attach $pid ```shell sleep 1000 ps -aux | grep sleep aidrifter@aidrifter-VM$ ps -aux | grep sleep aidrift+ 30054 0.0 0.0 7580 720 pts/8 S+ 09:33 0:00 sleep 1000 aidrift+ 30131 0.0 0.0 14528 916 pts/9 S+ 09:35 0:00 grep --color sleep # attach process pid sudo su (gdb) attach 30054 Attaching to process 30054 Reading symbols from /bin/sleep...(no debugging symbols found)...done. Reading symbols from /lib/x86_64-linux-gnu/libc.so.6...Reading symbols from /usr/lib/debug//lib/x86_64-linux-gnu/libc-2.24.so...done. done. Reading symbols from /lib64/ld-linux-x86-64.so.2...Reading symbols from /usr/lib/debug//lib/x86_64-linux-gnu/ld-2.24.so...done. done. 0x00007f00c2a892d0 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:84 84 ../sysdeps/unix/syscall-template.S: No such file or directory. (gdb) bt #0 0x00007f00c2a892d0 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:84 #1 0x0000555f4a95190f in ?? () #2 0x0000555f4a9516f0 in ?? () #3 0x0000555f4a94e994 in ?? () #4 0x00007f00c29dc3f1 in __libc_start_main (main=0x555f4a94e780, argc=2, argv=0x7ffd175385f8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffd175385e8) at ../csu/libc-start.c:291 #5 0x0000555f4a94ea6a in ?? () ````
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.