调试模å¼
转储文äšg调试
çž¬é—´é™æ€åˆ†æžï¼Œ˜q›ç¨‹æÈжæ€ã€?br/>
gdb –core=file
交互调试
调试新进½E?br/>
gdb exe
gdb –args exe [args]
调试已绘q行的进½E?br/> gdb –pid= ˜q›ç¨‹å?/p>
å†…æ ¸è°ƒè¯•
gdb exe
.
gdb –args exe [args]
.
gdb
file exe
run [args]
.
gdb –args gcc a.c -o a
show args
set args 多次˜q行讄¡½®å‘½ä×o(h¨´)è¡Œå‚æ•?/p>
path directory
.
show paths
.
show environment [varname]
.
set environment varname[=value] 清除或者设¾|®çŽ¯å¢ƒå˜é‡?/p>
¾l§æ‰¿˜q›å…¥gdb工作目录
改å˜å·¥ä½œç›®å½•
cd dirctory
昄¡¤ºè·¯å¾„
pwd
info terminal
run > a.txt
tty /dev/ttyb
˜qœç¨‹è°ƒè¯•å¯ç”¨˜q™äº›è¾…助ã€?/p>
inferior gdb¾l´æŠ¤çš„一¾pÕdˆ—对象åQŒæ¯ä¸ªinfå¯¹åº”ä¸€ä¸ªè°ƒè¯•ç›®æ ‡è¿›½E‹ã€?/p>
info inferior 昄¡¤ºä¸‹å±‚ä¿¡æ¯
NULL ½E‹åºæ²¡æœ‰è·‘或者已¾l终æ?br/>
clone-inferior -copies 2 å¤åˆ¶å½“å‰ä¸‹å±‚2ä»?
(gdb) info inferiors
Num Description Executable
* 1 process 10087 /home/gao/code/a
(gdb) clone-inferior -copies 2
Added inferior 2.
Added inferior 3.
(gdb) info inferiors
Num Description Executable
3½E‹åºæ²¡æœ‰è·‘或者已¾l终æ? /home/gao/code/a
2/home/gao/code/a
* 1 process 10087 /home/gao/code/a
(gdb)
切æ¢ä¸‹ç¨‹
inferior 2 切æ¢2˜q™ä¸ªä¸‹ç¨‹ã€?br/> ˜q›ç¨‹åäh˜¯0åQŒæ²¡å¼€å§‹è¿è¡Œã€?br/> run ˜q行èµäh¥ã€?/p>
.
å¢žåŠ ä¸€ä¸ªè¿è¡Œä¸‹å±?/p>
add-inferior -exec executeable å¢žåŠ ä¸€ä¸ªè¿è¡Œä¸‹å±?br/> 比如说调试一个æœåŠ¡ç«¯½E‹åºåQŒä¸€ä¸ªå®¢æˆïL(f¨¥ng)«¯½E‹åºã€?/p>
remove-inferior n åˆ æŽ‰ä¸€ä¸ªä¸‹å±?br/>
detach inferior ¾l§ç®‹˜q行 quit
kill inferior 调试˜q›ç¨‹é€€äº†ï¼Œä½†æ˜¯inferior¾Uªå½•˜q˜åœ¨ã€?/p>
(gdb) remove-
remove-inferiors remove-symbol-file
(gdb) remove-
remove-inferiors remove-symbol-file
(gdb) remove-
file a.exe å¯è‡ªè¡Œæ–‡ä»¶å’Œ½W¦å·æ–‡äšg是一个文ä»?/p>
å¯è‡ªè¡Œæ–‡ä»¶å’Œ½W¦å·æ–‡äšg分开
exec-file æŒ‡å®šç›®æ ‡æ–‡äšg
.
symbol-file 指定½W¦å·æ–‡äšg
run 开始è¿è¡?
å¯ä»¥æ”¯æŒ run > >> < é‡å®šå?
set args 清ç†å‘½ä×o(h¨´)è¡Œå‚æ•?/p>
gdb –pid= pid
attach pid
detach pid 分离˜q›ç¨‹¾l§ç®‹˜q行
.
quit ˜q›ç¨‹é€€å‡?/p>
.
q
ctrl
+D
æ–点
break 普�
tbreak 一‹Æ¡æ€?
rbreak æ£åˆ™è¡¨è¾¾å¼ä¸€æ‰ÒŽ(gu¨©)–ç‚?
linespec
æ ‡å·
explicit
-line number
实践
file banner
b main 䏿–在main函数
info funciton useage 昄¡¤ºuseage函数地å€
info *0x88888e4 直接写地å€è®‘Ö®šæ–点
info b 昄¡¤ºæ‰€æœ‰æ–ç‚?
list usage 昄¡¤ºuseage函数
b line.c:11
b +2 当剿˜„¡¤ºåˆ?4行+2行所以设定在17è¡?/p>
è™šæ‹Ÿæœø™®¾å®šç¡¬ä»¶æ–点会(x¨¬)å¤ÞpÓ|.
(gdb)hbreak hd_ioctl
(gdb) info b
ç‰©ç†æœºå¯ä»¥è®¾å®?
(gdb) hbreak v
Hardware assisted breakpoint 2 at 0x40053a: v. (2 locations)
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y
breakpoint already hit 1 time
1.1 y 0x000000000040054f in main at a.c:10 inf 1
1.2 y 0x000000000040054f in main at a.c:10 inf 2
2 hw breakpoint keep y
2.1 y 0x000000000040053a in v at a.c:4 inf 1
2.2 y 0x000000000040053a in v at a.c:4 inf 2
(gdb)
info b 昄¡¤ºæ–点
delete 1 åˆ é™¤
disable 1
enable 1
delete åˆ é™¤æ‰€æœ‰çš„æ–点
clear sum åˆ é™¤sum函数入å£çš„æ‰€æœ‰æ–ç‚?/p>
watchpoint 监视一个表辑ּåQŒå€¼å˜åŒ–䏿–ã€?/p>
watch aåQŠbåQ‹cåQd
watch *( int * )
watch fd 监控局部å˜é‡fd
c ¾l§ç®‹˜q行
info b //
注æ„åQŒx86¼‹¬äšg调试åQŒå†™æ“作åQŒæ‰§è¡Œè¿‡˜q™ä¸€è¡Œï¼Œgdb昄¡¤ºä¸‹ä¸€è¡Œï¼Œè¦çœ‹ä¸Šä¸€è¡Œã€‚hw watchpointåQŒåœ¨x86òq›_°wachtpointåŸÞZºŽ¼‹¬äšg实现åQŒå…¶ä»–åã^å°å¯èƒ½æ˜¯åŸÞZºŽè½¯äšg实现ã€?vc6¾U¯èÊYä»¶æ‰§è¡Œï¼Œæ‰§è¡Œç›®æ ‡é€Ÿåº¦ä½Žã€?br/>
执行ä½ç½®‘…过当å‰åŒºåŸŸåQŒæ— 效监视点ä¼?x¨¬)è¢«åˆ é™¤ã€?/p>
讉K—®ç›‘视ç‚?br/>
rwatch è¯Õdœä¸‹æ¥ã€?
awatch è¯ÀLˆ–写åœä¸‹æ¥ã€?awatch fd
watch -l
b hd_ioctl thread 1
info threads 带* 当剾U¿ç¨‹
¾J忙函数解决æ–ÒŽ(gu¨©)¡ˆ
b hd_ioctl thread 1 if fd > 0
当æ–点,æ–äº†åŽæ‰§è¡Œå‘½ä»?br/>
()command 12
()silent
()print “fd is %d\n”,fd
()continue
()end
动æ€pingä¸ä¿®æ”¹ä»£ç ã€?/p>
tracepoint ˜qœç¨‹ä¸ÀLœºé€šè®¯è°ƒè¯•åQŒå‰ç«¯stub立刻æ¢å¤æ‰§è¡ŒåQŒä½†ä¼?x¨¬)记录下æ¥ã€?/p>
catchpoint
˜q›å…¥åå‡½æ•°å†…éƒ¨ã€‚å•æ?step
汇编 stepi
stepi 4
¾cÖM¼¼nexti
ä¸è¦˜q›å…¥å函æ•?
next
¾l§ç®‹æ‰§è¡Œ
continue
è·‘è“væ¥ç›´åˆ?åäh–点命ä¸?/p>
until 3
è·‘è“væ¥ç›´åˆ?åäh–点命ä¸ï¼Œå¿«æ·¼›æ¢å…¶ä»–æ–点ã€?/p>
æ¢å¤æ‰§è¡Œç›´åˆ°å‡½æ•°˜q”回ã€?/p>
finish
gdb æœæ’°ä»£ç 调用函数ã€?br/> call sumåQ?åQ?åQ?…
强制main函数 return�br/> return 1
异常或æ–点进入调试器ã€?br/> 调试器å‘èµ·ä¸æ–,让程åºä¸æ–下æ¥ã€‚ctrlåQ‹CåQŒappæ”¶åˆ°ä¸æ–ä¿¡å·åQŒè¿›å…¥è°ƒè¯•器ã€?/p>
调试器读åŒ?调试½W¦å·ã€?/p>
二进åˆÓž¼è°ƒè¯•½W¦å·åQæºç ?/p>
linux dwarf å˜å‚¨è°ƒè¯•½W¦å·ä¿¡æ¯ã€‚gcc
readelf -h filename
里é¢å¦‚果有line location debugæ ‡ç¤ºreadelf -w 导出调试文äšg
gcc -g æ‰èƒ½è¾“出½W¦å·
ubuntu ½W¦å·æœåŠ¡å™?
< ddebs.ubuntu.com/pool/main/>
分离æ“作
strip
安装ubunteçš„linux å†…æ ¸½W¦å·
https://askubuntu.com/questions/197016/how-to-install-a-package-that-contains-ubuntu-kernel-debug-symbols
安装libc½W¦å·
dpkg -s /lib/x86_64-linux-gun/libc-2.15.so
dpkg -s libc.so.6
sudo apt-get -c aptproxy.conf install libc6-dbg
libc 调试½W¦å·
sudo apt-get install libc6-dbg
½W¦å·è·¯å¾„
gdb 使用file æˆ?symbolåQfile åŠ è²½W¦å·æ–‡äšg
自动æœçƒ¦ path 路径
åQˆgdbåQ‰i share
* å…׃ín库没调试信æ¯
æœçƒ¦½W¦å·
info vaiables regex ¾cÕdåQ函数ååQå˜é‡å
info addriess 函数å?/p>
info symbol 地å€
(gdb) info address main
Symbol “main” is a function at address 0x400547.
(gdb) info symbol 0x400547
main in section .text of /home/gao/code/a
.
info os
æŸ¥çœ‹åŠ è²çš„æ–‡ä»¶å†…å˜ä½¾|?/p>
info files
列出全局å˜é‡
info variable
info va
list
list -
dir æºç 路径
show dir
常用命ä×o(h¨´)æºç
安装¾pÈ»Ÿå·¥å…·æºç 和调è¯?/p>
apt-get source coreutils
sudo apt-get install coreutils-dbgsym
gdb /bin/ls
list main
dir ~/src/coreutils-7.4/src
list main
libc
sudo apt-get source libc6-dev
/home/ge/eglibc-2.15
dir æœçƒ¦è·¯å¾„ åQšåˆ†å‰?br/>
$cdir ¾~–译路径
cwd 当å‰å·¥ä½œè·¯å¾„
观察寄å˜å™?br/> info reg
æ ?br/>
å函数返回地å€
å‡½æ•°å‚æ•°
局部å˜é‡?/p>
bt n 观察函数˜q”回地å€
frame n åˆ‡æ¢æ ˆå“á
up n
down n
info frame åQ»addressåQ?br/> info args
info locals
注æ„åQŒåˆ‡æ¢æ ˆå¸§ä¹‹åŽå¯èƒ½ä¼š(x¨¬)å‘生åQŒæœ¬åœ°å˜é‡å€ég¸å‡†ç¡®åQŒå› 为值å˜åœ¨å¯„å˜å™¨ä¸éœ€è¦å°å¿ƒã€?/p>
观察内å˜
print
p /f 表达å¼? 表达å¼è¦æ‰“å°ä½ç½®
xduotcf
x
x /Nuf
N 打å°å‡ 个å•å…ƒ
u æ¯ä¸ªå•å…ƒå¤§å° b-1byte w-2byte h-4byte g-8byte
f så—符串i指ä×o(h¨´)æ ¼å¼
x/s 0xfffff81946000 打å°å—符ä¸?/p>
x /32bx arg bit 16¼›åˆ¶
(gdb) x /32bx &i
0x7fffffffc76c: 0x01 0x00 0x00 0x00 0x70 0x05 0x40 0x00
0x7fffffffc774: 0x00 0x00 0x00 0x00 0x40 0xfa 0xa2 0xf7
0x7fffffffc77c: 0xff 0x7f 0x00 0x00 0x58 0xc8 0xff 0xff
0x7fffffffc784: 0xff 0x7f 0x00 0x00 0x58 0xc8 0xff 0xff
(gdb)p arg[0]
p arg[i]
p *&a[0]@10 a0数组开始的10个元�/p>
åæ±‡¾~?/p>
disas main mainåæ±‡¾~–代ç ?br/> x/5i schedule ˜q™ä¸ªåœ°å€å¼€å§‹çš„5æ¡æ±‡¾~–指令ã€?/p>
gdb mov 从左往匙µ‹å€¼at&t汇编ã€?/p>
stop è¦ä¸è¦ä¸æ–下æ¥çœ‹
printf 打å°ä¿¡æ¯
pass è¦ä¸è¦ä¼ 递给应用½E‹åºã€?/p>
handle SIGPIPE ä¸è¦ä¸æ–下æ¥åQŒæ‰“åîC¸€ä¸ªä¿¡æ¯ï¼Œ¾|‘络½E‹åºå¸¸ç”¨
(gdb) handle SIGPIPE nostop
Signal Stop Print Pass to program Description
SIGPIPE No Yes Yes Broken pipe
info threads
LWPåQlight weight process ¾U¿ç¨‹¾~–å·ã€?br/> * gdb当剾U¿ç¨‹
切æ¢å½“剾U¿ç¨‹
thread 2
æ‰“å°æ‰€æœ‰çº¿½E?/p>
thread apply all bt 针对一¾Ÿ¤çº¿½E‹çš„命ä×o(h¨´)é¿å…åˆ‡æ¢æ¥çœ‹ã€?/p>
¾U¿ç¨‹æ”¹åå?/p>
thread name åQ»nameåQ?/p>
我自å·Þq»éª?LWP å¯ä»¥å¾ˆå¥½çš„观察线½E‹è´Ÿè½½æƒ…å†üc(di¨£n)€?/p>
å‚考资料:(x¨¬)
Object-oriented Programming with ANSI-C
1993òqß_(d¨¢)¼Œ½W¬ä¸€ä»½c如何¾~–写OO的资æ–?free.
OOC.PDF
https://www.cs.rit.edu/~ats/books/ooc.pdf
䏿–‡¾˜»è¯‘åQ?br/> https://code.google.com/p/ooc/downloads/detail?name=ooc-translate-preview-r26.pdf&can=2&q=
轻釾U§çš„Cè¯è¨€é¢å‘对象¾~–程框架
http://sinojelly.blog.51cto.com/479153/281184
UML—OOPC嵌入å¼Cè¯è¨€å¼€å‘ç²¾è®?br/>
é‡Œé¢æœ‰ä¸€å¥—框架å¯ä»?c写OO.
http://pan.baidu.com/share/link?shareid=3402978666&uk=3188261067&adapt=pc&fr=ftw#path=%252FC%25E8%25AF%25AD%25E8%25A8%2580
ä½ è¯•˜q‡è¿™æ ·å†™C(j¨©)½E‹åºå?åQï¼å‡½æ•°å¼ç¼–½E?br/> < >
我所å爱çš?C è¯è¨€é¢å‘对象¾~–程范å¼åQï¼äº‘风
http://blog.codingnow.com/2010/03/object_oriented_programming_in_c.html
Cè¯è¨€é¢å‘对象¾~–程 -- 6½‹‡ä¸“æ ?br/> http://blog.csdn.net/column/details/object-orient-c.html
** valgrind --tool=cachegrind ./test2**
#include <stdio.h>
#define MAXROW 8000
#define MAXCOL 8000
int main () {
int i,j;
static int x[MAXROW][MAXCOL];
printf ("Starting!\n");
for (i=0;i<MAXROW;i++)
for (j=0;j<MAXCOL;j++)
x[i][j] = i*j;
printf("Completed!\n");
return 0;
}
#include <stdio.h>
#define MAXROW 8000
#define MAXCOL 8000
int main () {
int i,j;
static int x[MAXROW][MAXCOL];
printf ("Starting!\n");
for (j=0;j<MAXCOL;j++)
for (i=0;i<MAXROW;i++)
x[i][j] = i*j;
printf("Completed!\n");
return 0;
}
```
##¾l“æžœ
Command: ./test1
Starting!
Completed!
I refs: 905,721,688
I1 misses: 4,177
LLi misses: 2,808
I1 miss rate: 0.00%
LLi miss rate: 0.00%
D refs: 514,830,867 (386,118,735 rd + 128,712,132 wr)
D1 misses: 4,025,828 ( 23,565 rd + 4,002,263 wr)
LLd misses: 4,008,456 ( 6,997 rd + 4,001,459 wr)
D1 miss rate: 0.8% ( 0.0% + 3.1% )
LLd miss rate: 0.8% ( 0.0% + 3.1% )
LL refs: 4,030,005 ( 27,742 rd + 4,002,263 wr)
LL misses: 4,011,264 ( 9,805 rd + 4,001,459 wr)
LL miss rate: 0.3% ( 0.0% + 3.1% )
gcc -o test2 test2.c
** valgrind --tool=cachegrind ./test2**
I refs: 905,720,801
I1 misses: 4,113
LLi misses: 2,811
I1 miss rate: 0.00%
LLi miss rate: 0.00%
D refs: 514,830,348 (386,118,427 rd + 128,711,921 wr)
D1 misses: 64,025,705 ( 23,462 rd + 64,002,243 wr)
LLd misses: 4,016,427 ( 6,977 rd + 4,009,450 wr)
D1 miss rate: 12.4% ( 0.0% + 49.7% )
LLd miss rate: 0.8% ( 0.0% + 3.1% )
LL refs: 64,029,818 ( 27,575 rd + 64,002,243 wr)
LL misses: 4,019,238 ( 9,788 rd + 4,009,450 wr)
LL miss rate: 0.3% ( 0.0% + 3.1% )
Starting!
Completed!
```
valgrind调试CPU¾~“å˜å‘½ä¸çŽ‡å’Œå†…å˜æ³„æ¼
http://laoxu.blog.51cto.com/4120547/1395236