# [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 ?? ()
````