@oro-oro
2015-08-18T03:17:20.000000Z
字数 5399
阅读 2387
AndroidARM
$ adb shell# cd /data/local/tmp# ./hello./helloHello ARM World!
下面开始调试 hello,尝试反汇编、断点、查看寄存器等操作。
# ./gdb -q hello./gdb -q helloReading symbols from /data/local/tmp/hello...(no debugging symbols found)...done.
gdb disassemble/disas [function-name]反汇编一下main函数的内容。
(gdb) disas maindisas mainDump of assembler code for function main:0x00008258 <+0>: push {r11, lr}0x0000825c <+4>: add r11, sp, #40x00008260 <+8>: sub sp, sp, #320x00008264 <+12>: str r0, [r11, #-32]0x00008268 <+16>: str r1, [r11, #-36] ; 0x240x0000826c <+20>: ldr r3, [pc, #52] ; 0x82a8 <main+80>0x00008270 <+24>: add r3, pc, r30x00008274 <+28>: sub r12, r11, #240x00008278 <+32>: mov lr, r30x0000827c <+36>: ldm lr!, {r0, r1, r2, r3}0x00008280 <+40>: stmia r12!, {r0, r1, r2, r3}0x00008284 <+44>: ldr r3, [lr]0x00008288 <+48>: strb r3, [r12]0x0000828c <+52>: sub r3, r11, #240x00008290 <+56>: mov r0, r30x00008294 <+60>: bl 0x82340x00008298 <+64>: mov r3, #00x0000829c <+68>: mov r0, r30x000082a0 <+72>: sub sp, r11, #40x000082a4 <+76>: pop {r11, pc}0x000082a8 <+80>: andeq r0, r0, r4, ror #1End of assembler dump.
第9行就是main函数的入口,适合第一个断点。
第19行就是函数调用,这里下断点,查看寄存器的值,应该会看到要打印的字符串的。
break/b address/line_number下断点
(gdb) b *0x0000826cb *0x0000826cBreakpoint 1 at 0x826c(gdb) b *0x00008290 @这里下到18行b *0x00008290Breakpoint 2 at 0x8290
info/i查看信息,可以查看断点信息、寄存器信息等。
i b查看断点
(gdb) i bi bNum Type Disp Enb Address What1 breakpoint keep y 0x0000826c <main+20>2 breakpoint keep y 0x00008290 <main+56>
delete/d num删除断点
(gdb) b *0x000082a8b *0x000082a8Breakpoint 3 at 0x82a8(gdb) i bi bNum Type Disp Enb Address What1 breakpoint keep y 0x0000826c <main+20>2 breakpoint keep y 0x00008290 <main+56>3 breakpoint keep y 0x000082a8 <main+80>(gdb) d 3d 3(gdb) i bi bNum Type Disp Enb Address What1 breakpoint keep y 0x0000826c <main+20>2 breakpoint keep y 0x00008290 <main+56>
run/r让程序跑起来
(gdb) rrStarting program: /data/local/tmp/helloBFD: /system/bin/linker: warning: sh_link not set for section `.ARM.exidx'BFD: /system/bin/linker: warning: sh_link not set for section `.ARM.exidx'warning: Unable to find dynamic linker breakpoint function.GDB will be unable to debug shared library initializersand track explicitly loaded dynamic code.Breakpoint 1, 0x0000826c in main ()(gdb) nnSingle stepping until exit from function main,which has no line number information.Breakpoint 2, 0x00008290 in main ()
(gdb) i ri rr0 0x6c6c6548 1819043144r1 0x5241206f 1379999855r2 0x6f57204d 1867980877r3 0xbeed3c4c -1091748788 @ r3 的值会赋给r0,此时还没有赋值r4 0x8258 33368r5 0x1 1r6 0xafd41504 -1345055484r7 0xbeed3cac -1091748692r8 0x0 0r9 0x0 0r10 0x0 0r11 0xbeed3c64 -1091748764r12 0xbeed3c5c -1091748772sp 0xbeed3c40 0xbeed3c40lr 0x836c 33644pc 0x8290 0x8290 <main+56>cpsr 0x10 16(gdb) x 0xbeed3c4cx 0xbeed3c4c0xbeed3c4c: "Hello ARM World!"
继续给19行下断点,再查看r0的值。
(gdb) disas maindisas mainDump of assembler code for function main:0x00008258 <+0>: push {r11, lr}0x0000825c <+4>: add r11, sp, #40x00008260 <+8>: sub sp, sp, #320x00008264 <+12>: str r0, [r11, #-32]0x00008268 <+16>: str r1, [r11, #-36] ; 0x240x0000826c <+20>: ldr r3, [pc, #52] ; 0x82a8 <main+80>0x00008270 <+24>: add r3, pc, r30x00008274 <+28>: sub r12, r11, #240x00008278 <+32>: mov lr, r30x0000827c <+36>: ldm lr!, {r0, r1, r2, r3}0x00008280 <+40>: stmia r12!, {r0, r1, r2, r3}0x00008284 <+44>: ldr r3, [lr]0x00008288 <+48>: strb r3, [r12]0x0000828c <+52>: sub r3, r11, #24=> 0x00008290 <+56>: mov r0, r30x00008294 <+60>: bl 0x82340x00008298 <+64>: mov r3, #00x0000829c <+68>: mov r0, r30x000082a0 <+72>: sub sp, r11, #40x000082a4 <+76>: pop {r11, pc}0x000082a8 <+80>: andeq r0, r0, r4, ror #1End of assembler dump.(gdb) b *0x00008294b *0x00008294Breakpoint 4 at 0x8294(gdb) nnSingle stepping until exit from function main,which has no line number information.Breakpoint 4, 0x00008294 in main ()(gdb) i ri rr0 0xbeed3c4c -1091748788 @ r0 就是 puts 函数的参数r1 0x5241206f 1379999855r2 0x6f57204d 1867980877r3 0xbeed3c4c -1091748788r4 0x8258 33368r5 0x1 1r6 0xafd41504 -1345055484r7 0xbeed3cac -1091748692r8 0x0 0r9 0x0 0r10 0x0 0r11 0xbeed3c64 -1091748764r12 0xbeed3c5c -1091748772sp 0xbeed3c40 0xbeed3c40lr 0x836c 33644pc 0x8294 0x8294 <main+60>cpsr 0x10 16(gdb) x 0xbeed3c4cx 0xbeed3c4c0xbeed3c4c: "Hello ARM World!"
where/whe查看当然程序运行所在的位置
(gdb) whewhe#0 0x00008294 in main ()(gdb)
commands调试的时候,自动执行某些命令。
譬如,让断点2触发时,自动显示寄存器信息。(第6-16行)
(gdb) i bi bNum Type Disp Enb Address What1 breakpoint keep y 0x0000826c <main+20>breakpoint already hit 1 time2 breakpoint keep y 0x00008290 <main+56>breakpoint already hit 1 time4 breakpoint keep y 0x00008294 <main+60>(gdb) commands 2 // -------------------------- 开始 -------------------------commands 2Type commands for breakpoint(s) 2, one per line.End with a line saying just "end".>i ri r>end // -------------------------- 结束 --------------------------end(gdb) nnSingle stepping until exit from function main,which has no line number information.Breakpoint 4, 0x00008294 in main ()(gdb) nnSingle stepping until exit from function main,which has no line number information.Hello ARM World!0xafd14dba in __libc_init () from /system/lib/libc.so(gdb) rrThe program being debugged has been started already.Start it from the beginning? (y or n) yyStarting program: /data/local/tmp/helloBFD: /system/bin/linker: warning: sh_link not set for section `.ARM.exidx'BFD: /system/bin/linker: warning: sh_link not set for section `.ARM.exidx'warning: Unable to find dynamic linker breakpoint function.GDB will be unable to debug shared library initializersand track explicitly loaded dynamic code.Breakpoint 1, 0x0000826c in main ()(gdb) nnSingle stepping until exit from function main,which has no line number information.Breakpoint 2, 0x00008290 in main ()r0 0x6c6c6548 1819043144r1 0x5241206f 1379999855r2 0x6f57204d 1867980877r3 0xbefbcc4c -1090794420r4 0x8258 33368r5 0x1 1r6 0xafd41504 -1345055484r7 0xbefbccac -1090794324r8 0x0 0r9 0x0 0r10 0x0 0r11 0xbefbcc64 -1090794396r12 0xbefbcc5c -1090794404sp 0xbefbcc40 0xbefbcc40lr 0x836c 33644pc 0x8290 0x8290 <main+56>cpsr 0x10 16(gdb)
continue/c继续运行,跟next/n 效果差不多。
(gdb) ccContinuing.Breakpoint 4, 0x00008294 in main ()(gdb) ccContinuing.Hello ARM World!Program exited normally.(gdb)