Отладка в GDB
Upcoming SlideShare
Loading in...5
×
 

Отладка в GDB

on

  • 529 views

 

Statistics

Views

Total Views
529
Views on SlideShare
529
Embed Views
0

Actions

Likes
0
Downloads
1
Comments
0

0 Embeds 0

No embeds

Accessibility

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Отладка в GDB Отладка в GDB Presentation Transcript

  • Основы отладки в GDB
  • Arguments & environment Stack unused memory Heap Uninitialized data Initialized data Text
  • int main(int argc, char *argv[]) { int number; int *pointer; number = atoi(argv[1]); pointer = number; print(number); return 0; } void print(int *x) { printf("The number supplied is %dn", *x); }
  • $ gcc -o test test.c test.c: In function ‘main’: test.c:7:13: warning: assignment makes pointer from integer without a cast test.c: At top level: test.c:8:5: note: previous implicit declaration of ‘print’ was here test.c: In function ‘print’: test.c:15:5: warning: incompatible implicit declaration of built-in function ‘printf’ $ ./test Segmentation fault
  • $ gdb test Reading symbols from /home/user/test...(no debugging symbols found)...done. (gdb) run Starting program: /home/user/test Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7a82b35 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
  • (gdb) backtrace #0 0x00007ffff7a82b35 in ?? () from /lib/x86_64-linux-gnu/libc.so.6 #1 0x00007ffff7a7f900 in atoi () from /lib/x86_64-linux-gnu/libc.so.6 #2 0x000000000040056b in main ()
  • (gdb) x/10i $rip => 0x7ffff7a82b35: movzbl (%rbx),%eax 0x7ffff7a82b38: mov 0x68(%r8),%r9 0x7ffff7a82b3c: mov %rbx,%r13 0x7ffff7a82b3f: movsbq %al,%rcx 0x7ffff7a82b43: testb $0x20,0x1(%r9,%rcx,2) 0x7ffff7a82b49: je 0x7ffff7a82b65 0x7ffff7a82b4b: nopl 0x0(%rax,%rax,1) 0x7ffff7a82b50: add $0x1,%r13 0x7ffff7a82b54: movzbl 0x0(%r13),%eax 0x7ffff7a82b59: movsbq %al,%rcx
  •  
  • (gdb) info registers rax 0x0 0 rbx 0x0 0 rcx 0x0 0 rdx 0xa 10 rsi 0x0 0 rdi 0x0 0 rbp 0x7fffffffe160 0x7fffffffe160 rsp 0x7fffffffe0c0 0x7fffffffe0c0 rip 0x7ffff7a82b35 0x7ffff7a82b35 eflags 0x10283 [ CF SF IF RF ] cs 0x33 51 ss 0x2b 43 ...
  • (gdb) info locals No symbol table info available. (gdb) info args No symbol table info available. (gdb) quit A debugging session is active. Inferior 1 [process 29043] will be killed. Quit anyway? (y or n) y
  • $ gcc -g -o test test.c $ gdb test Reading symbols from /home/ium/test...done. (gdb) list 1 int main(int argc, char *argv[]) 2 { 3 int number; 4 int *pointer; 5 6 number = atoi(argv[1]); 7 pointer = number; 8 print(number); 9 10 return 0;
  • (gdb) break 6 Breakpoint 1 at 0x400553: file test.c, line 6. (gdb) run Starting program: /home/ium/test Breakpoint 1, main (argc=1, argv=0x7fffffffe248) at test.c:6 6 number = atoi(argv[1]); (gdb) print argv[1] $1 = 0x0
  • (gdb) continue Continuing. Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7a82b35 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
  • (gdb) delete Delete all breakpoints? (y or n) y (gdb) run 255 The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /home/user/test 255 Program received signal SIGSEGV, Segmentation fault. 0x000000000040059f in print (x=0xff) at test.c:15 15 printf("The number supplied is %dn", *x);
  • (gdb) backtrace #0 0x000000000040059f in print (x=0xff) at test.c:15 #1 0x0000000000400588 in main (argc=2, argv=0x7fffffffe228) at test.c:8 (gdb) info args x = 0xff (gdb) frame 1 #1 0x0000000000400588 in main (argc=2, argv=0x7fffffffe228) at test.c:8 8 print(number);
  • (gdb) info locals number = 255 pointer = 0xff (gdb) frame 0 (gdb) x /5i $rip => 0x40059f <print+16>: mov (%rax),%eax 0x4005a1 <print+18>: mov %eax,%esi 0x4005a3 <print+20>: mov $0x4006ac,%edi 0x4005a8 <print+25>: mov $0x0,%eax 0x4005ad <print+30>: callq 0x400428 <print@plt> (gdb) x /s 0x4006ac 0x4006ac: &quot;The number supplied is %dn&quot;
  • (gdb) info registers rax 0xff 255 rbx 0x0 0 rcx 0x5 5 rdx 0x40058f 4195727 rsi 0x0 0 rdi 0xff 255 rbp 0x7fffffffe110 0x7fffffffe110 rsp 0x7fffffffe100 0x7fffffffe100 rip 0x40059f 0x40059f <print+16> eflags 0x10206 [ PF IF RF ] cs 0x33 51 ss 0x2b 43
  •  
  • (gdb) disassemble print Dump of assembler code for function print: 0x000000000040058f <+0>: push %rbp 0x0000000000400590 <+1>: mov %rsp,%rbp 0x0000000000400593 <+4>: sub $0x10,%rsp 0x0000000000400597 <+8>: mov %rdi,-0x8(%rbp) 0x000000000040059b <+12>: mov -0x8(%rbp),%rax => 0x000000000040059f <+16>: mov (%rax),%eax 0x00000000004005a1 <+18>: mov %eax,%esi 0x00000000004005a3 <+20>: mov $0x4006ac,%edi 0x00000000004005a8 <+25>: mov $0x0,%eax 0x00000000004005ad <+30>: callq 0x400428 <printf> 0x00000000004005b2 <+35>: leaveq 0x00000000004005b3 <+36>: retq End of assembler dump.
  •  
  • (gdb) x /4xg $rsp 0x7fffffffe170: 0x0000000000000000 0x00000000000000ff 0x7fffffffe180: 0x00007fffffffe1b0 0x0000000000400588 (gdb) print $rbp $1 = (void *) 0x7fffffffe180
  •  
  •