Top Banner
GDB Rocks! Kent Chen GDB The GNU Project Debugger
91

GDB Rocks!

Jan 15, 2015

Download

Technology

Kent Chen

GDB Rocks!
Basic gdb case study, advanced gdb tricks, shared library debugging
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: GDB Rocks!

GDB Rocks!Kent Chen

GDBThe GNU Project

Debugger

Page 3: GDB Rocks!

為什麼要學GDB

Why everybody learns GDB?

Page 4: GDB Rocks!

非互動式/交談式Non-Interactive

Debugging

Page 5: GDB Rocks!

strace - system call, signal

ltrace - library call

Page 7: GDB Rocks!

GDB Source-Level

Debugger

Page 8: GDB Rocks!

互動式/交談式你叫它幹麻它就幹麻

Interactive Debugging

Page 9: GDB Rocks!

有了Debugger Coding是彩色的

- by Jserv/宅色夫大大

No Debugger, No Happy Coding

Page 10: GDB Rocks!

學會了GDB我有種山頂洞人學會用火的感動

- by 張至

張至是誰?! 我也不認識, Google到的,某某鄉民吧!

Page 11: GDB Rocks!

GDB Front Ends

Page 12: GDB Rocks!

gdbtui

Page 13: GDB Rocks!

cgdb

Page 14: GDB Rocks!

ddd (Joe’s Fav)

Page 15: GDB Rocks!

insight

Page 16: GDB Rocks!

clewn / vim + gdb

Page 17: GDB Rocks!

pyclewn

Page 18: GDB Rocks!

gdbmgr

Page 19: GDB Rocks!

分享小弟入門經驗

Sharing my real-world GDB experience

Page 20: GDB Rocks!

牛刀小試

幼幼班GDB Beginner’s training

Page 21: GDB Rocks!

Change memory contents on-the-fly

Page 22: GDB Rocks!

Change memory contents on-the-fly

Page 23: GDB Rocks!

stack backtrace

Page 24: GDB Rocks!

Attach to a process

Page 25: GDB Rocks!

Jump $pc (program counter)

Page 26: GDB Rocks!

core dump

Page 27: GDB Rocks!

core dump (cont.)

Page 28: GDB Rocks!

core dump (cont.)

Page 29: GDB Rocks!

Patch binary file

Page 30: GDB Rocks!

Patch binary file (cont.)

$objdump -d -S -l -shrt dump1.out Change “ef01” to “ef00”

Page 31: GDB Rocks!

奇技淫巧

進階班Advanced GDB Tricks

Page 32: GDB Rocks!

奇技淫巧:奇異而眩人耳目の

技能或事物

(from 教育部國語辭典)

Page 33: GDB Rocks!

SIGSEGV + GDB

Page 34: GDB Rocks!

C interpreter1. $ gdb `which gdb`

2. (gdb) start

3. Enjoy your world…

• Example:

(gdb)  p  1  +  2  +  abs(-­‐3)(gdb)  p  strcmp("VIVOTEK",  "AXIS")(gdb)  x/s  getenv(“HOME”)(gdb)  p  (char*)getenv("HOME")(gdb)  p  (char)*getenv("HOME")(gdb)  p  printf("%d\n",  12345678)

Page 35: GDB Rocks!

Signal HandlerTerminal hang / Reboot PC

You have to close terminal (e.g., PuTTY, iTerm,...)

Conventional solution

GNU Screen / Tmux

nohup

GDB solution

$ gdb [program] [pid]

(gdb) handle SIGHUP nopass

(gdb) continue

(gdb)  handle  SIGHUPSignal                Stop            Print      Pass  to  program  DescriptionSIGHUP                Yes              Yes          Yes                          Hangup(gdb)  handle  SIGHUP  nopassSignal                Stop            Print      Pass  to  program  DescriptionSIGHUP                Yes              Yes          No                            Hangup

Program  received  signal  SIGHUP,  Hangup.0x0000003ac7a954e0  in  __nanosleep_nocancel  ()  from  /lib64/libc.so.6(gdb)Continuing.

Page 36: GDB Rocks!

經典案例實戰探討

A real-world case study

Page 37: GDB Rocks!

案例一、Case 1

Page 38: GDB Rocks!

GNU C Library(glibc)

debugging / 除錯

Page 39: GDB Rocks!

Why?

Page 40: GDB Rocks!

追求卓越

Pursuit of excellence :)

Page 41: GDB Rocks!

DieLink呆吝蚵

Page 42: GDB Rocks!

江湖中流傳已久

A well-know issue

Page 43: GDB Rocks!

某某Daemon

之死Process crash issue

Page 44: GDB Rocks!

dmesg

Page 45: GDB Rocks!

cat /proc/`pidof configer`/maps

Page 47: GDB Rocks!

WTF!!不會吧(驚)

Page 48: GDB Rocks!

ㄎㄎ我有學過

Core dump

Page 49: GDB Rocks!

無敵の gdb core dump

Page 50: GDB Rocks!

backtrace (bt)

Page 51: GDB Rocks!

_IO_strn_overflow ()vfprintf ()

C language !?

Page 52: GDB Rocks!

WTF!!不會吧(驚驚)

Page 53: GDB Rocks!

欲窮千里目更上一層樓

Page 54: GDB Rocks!

ㄎㄎ我有學過gdb frame UP

Page 55: GDB Rocks!

frame [index] / up / down

Page 56: GDB Rocks!

WTF!!ARM assembly

Page 57: GDB Rocks!

組合語言什麼鬼呀

大學修完課後就通通還給老師了

Page 58: GDB Rocks!

C Code & ARM assembly

Page 59: GDB Rocks!

看似專業 Pro

Looks “GEEK”

Page 60: GDB Rocks!

In fact實際上

Page 61: GDB Rocks!

發現 gcc -O3 TMD

實在太難看了It’s god damn hard to read after gcc -O3

Page 62: GDB Rocks!

我們需要Source LevelDebugging

Page 63: GDB Rocks!

Use the

SourceLoser... Orz

Page 64: GDB Rocks!

May The Source

Be With You

Page 65: GDB Rocks!

How?

Page 66: GDB Rocks!

RTFMRead The

Fucking Manual

Page 67: GDB Rocks!

load by symbol-file cmd

Page 68: GDB Rocks!

Re-build debug version shared library

with "-g"

Page 69: GDB Rocks!

set solib-absolute-prefix

Page 70: GDB Rocks!

Source be with You

Page 71: GDB Rocks!

發現傳入snprintf()

の資料都正確

Page 72: GDB Rocks!

OMFG!

Page 73: GDB Rocks!

電梯繼續向下gdb frame down

Page 74: GDB Rocks!

到了/lib/libc.so.6

-> libc-2.5.90.so

Page 75: GDB Rocks!

Shit!若仿照上面作法

Page 76: GDB Rocks!

難不成要自己build debug版のlibc-2.5.90

Page 77: GDB Rocks!

Oh No !

Page 78: GDB Rocks!

使用大廠の偷偷Solution

Page 79: GDB Rocks!

你有權利Say NO

Page 80: GDB Rocks!

MontaVista已經幫我們Build 好了

Page 81: GDB Rocks!

lib*.*.so.*.debug

Page 82: GDB Rocks!

glibc source level debug

Page 83: GDB Rocks!

DEMO

Page 84: GDB Rocks!

Null pointer access issue

Page 85: GDB Rocks!

多虧了神器 GDB

Page 86: GDB Rocks!

我們終於學會Shared Library

Debugging

Page 87: GDB Rocks!

某Daemon之死至今仍是個謎(驚)

Page 88: GDB Rocks!

案例二、Case 2

Page 89: GDB Rocks!

劫持 FDsFile Descriptors Hijacking