GDB調(diào)試命令詳解
1.complile
GCC:
gcc -Wall -o2 -g ?file.cpp
MAKEFILE:
CFLAGS = -Wall -o2 -g
configure:
./configure CFLAGS="-Wall -o2 -g"
2.gdb filename [core file]
? ? ? ? ? ? file core.29724
? ? ? ? ? ? ?core.29724: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from './a.out'
3.command
set breakpoint : break -> b
b function-name
b line-number
b file-name:line-number
b file-name:function-name
b +/- offset
b *address
+/- offset :從當(dāng)前位置的偏移行數(shù)
*address 代碼段內(nèi)的地址
example:
info break Num ? ? Type ? ? ? ? ? Disp Enb Address ? ? ? ? ? ?What 2 ? ? ? breakpoint ? ? keep y ? 0x0000000000454112 in main(int, char**) at /home/lt/src/test/src/test.cpp:27
4.run -a
(gdb)run -a
5.backtrace -> bt
bt
bt N/-N
bt full
bt full N/-N
bt number
6.info register -> info reg
rax ? ? ? ? ? ?0x7ffff102cf40 ? 140737236881216 rbx ? ? ? ? ? ?0x4940d0 4800720 rcx ? ? ? ? ? ?0xb ? ? ?11 rdx ? ? ? ? ? ?0x7fffffffe248 ? 140737488347720 rsi ? ? ? ? ? ?0x1 ? ? ?1 rdi ? ? ? ? ? ?0x7fffffffe10f ? 140737488347407 rbp ? ? ? ? ? ?0x7fffffffe0c0 ? 0x7fffffffe0c0 rsp ? ? ? ? ? ?0x7fffffffd040 ? 0x7fffffffd040 r8 ? ? ? ? ? ? 0x0 ? ? ?0 r9 ? ? ? ? ? ? 0x5241564e20524148 ? ? ? 5927113478145982792 r10 ? ? ? ? ? ?0x4c42203252414843 ? ? ? 5494989895845890115 r11 ? ? ? ? ? ?0x7ffff0d3e740 ? 140737233807168 r12 ? ? ? ? ? ?0x40f840 4257856 r13 ? ? ? ? ? ?0x7fffffffe240 ? 140737488347712 r14 ? ? ? ? ? ?0x0 ? ? ?0 r15 ? ? ? ? ? ?0x0 ? ? ?0 rip ? ? ? ? ? ?0x453c98 0x453c98 <DALServiceMain::DALServiceMain(int, char**)+34> eflags ? ? ? ? 0x202 ? ?[ IF ] cs ? ? ? ? ? ? 0x33 ? ? 51 ss ? ? ? ? ? ? 0x2b ? ? 43 ds ? ? ? ? ? ? 0x0 ? ? ?0 es ? ? ? ? ? ? 0x0 ? ? ?0 fs ? ? ? ? ? ? 0x0 ? ? ?0 gs ? ? ? ? ? ? 0x0 ? ? ?0
顯示register內(nèi)容,使用$號:
p $rax
p/格式
x 16進(jìn)制
d 10
u ?無符號十進(jìn)制
o 8
t ?2進(jìn)制,two
a 地址
c ascii
f 浮點
s 字串
i ?機器語言
x命令可顯示內(nèi)存的內(nèi)容, x來源eXamining
程序 i=100
(gdb) x $pc 0x4009f6 <main()+8>: ? ?-57 '\307'
x/i 顯示匯編指令
(gdb) x/i ? 0x4009fa <main()+12>: ? ? ? ?add ? ?%al,(%rax)
x/NFU ADDR ? ADDR希望顯示的地址 N為次數(shù) F為之前的格式,U表示單位:b 字節(jié) h 半字(2字節(jié)) w字(4字節(jié))g 雙字(8字節(jié))
從pc所指地址顯示10條指令:
(gdb) x/10i $pc => 0x4009f6 <main()+8>: movl ? $0x64,-0x4(%rbp) ? 0x4009fd <main()+15>: ? ? ? ?mov ? ?$0x8,%esi ? 0x400a02 <main()+20>: ? ? ? ?mov ? ?$0x601080,%edi ? 0x400a07 <main()+25>: ? ? ? ?callq ?0x400868 <_ZNSolsEm@plt> ? 0x400a0c <main()+30>: ? ? ? ?mov ? ?%rax,%rdi ? 0x400a0f <main()+33>: ? ? ? ?mov ? ?$0x400888,%esi ? 0x400a14 <main()+38>: ? ? ? ?callq ?0x400878 <_ZNSolsEPFRSoS_E@plt> ? 0x400a19 <main()+43>: ? ? ? ?mov ? ?$0x4,%esi ? 0x400a1e <main()+48>: ? ? ? ?mov ? ?$0x400b64,%edi ? 0x400a23 <main()+53>: ? ? ? ?mov ? ?$0x0,%eax
6.反匯編命令
disassemble 簡寫 disas
disas
disas ?程序計數(shù)器
disas ?開始地址 結(jié)束地址
(gdb) disas Dump of assembler code for function main(): ? 0x00000000004009ee <+0>: ? ? push ? %rbp ? 0x00000000004009ef <+1>: ? ? mov ? ?%rsp,%rbp ? 0x00000000004009f2 <+4>: ? ? sub ? ?$0x10,%rsp => 0x00000000004009f6 <+8>: ? ? movl ? $0x64,-0x4(%rbp) ? 0x00000000004009fd <+15>: ? ?mov ? ?$0x8,%esi ? 0x0000000000400a02 <+20>: ? ?mov ? ?$0x601080,%edi ? 0x0000000000400a07 <+25>: ? ?callq ?0x400868 <_ZNSolsEm@plt> ? 0x0000000000400a0c <+30>: ? ?mov ? ?%rax,%rdi ? 0x0000000000400a0f <+33>: ? ?mov ? ?$0x400888,%esi ? 0x0000000000400a14 <+38>: ? ?callq ?0x400878 <_ZNSolsEPFRSoS_E@plt> ? 0x0000000000400a19 <+43>: ? ?mov ? ?$0x4,%esi ? 0x0000000000400a1e <+48>: ? ?mov ? ?$0x400b64,%edi ? 0x0000000000400a23 <+53>: ? ?mov ? ?$0x0,%eax ? 0x0000000000400a28 <+58>: ? ?callq ?0x4007f8 <printf@plt> ? 0x0000000000400a2d <+63>: ? ?mov ? ?$0x0,%eax ? 0x0000000000400a32 <+68>: ? ?leaveq ? 0x0000000000400a33 <+69>: ? ?retq ? End of assembler dump.
1.運行
n 單步執(zhí)行 next
s 進(jìn)入函數(shù) ?step
c 繼續(xù)運行 continue
2.watch ?監(jiān)視變量或表達(dá)式
? 發(fā)生變化時,停止
?awatch 被訪問,改變時
?rwatch 被訪問
3 delete 刪除端點,監(jiān)視點
info b
delete
4.改變變量的值
set variable i = 500
p i
5.生成內(nèi)核轉(zhuǎn)儲文件,即core文件
generate-core-file
從命令行
gcore 'pidof exe`
6. attach 進(jìn)程id
顯示進(jìn)程信息
(gdb) info proc process 6635 cmdline = './a.out' cwd = '/root' exe = '/root/a.out'