2016-05-19 24 views
6

Si prega di guardare la riga di comando qui sotto. Ho impostato due punti di interruzione: uno su strcpy e l'altro su printf. Perché ha saltato il breakpoint 1?Perché gdb non si infrange su strcpy?

[email protected]:~/Desktop/Programs# gcc -g -o exp exp.c 
[email protected]:~/Desktop/Programs# gdb -q exp 
Reading symbols from /root/Desktop/Programs/exp...done. 
(gdb) list 
1 #include <stdio.h> 
2 #include <string.h> 
3 
4 int main() { 
5  char str_a[20]; 
6  
7  strcpy(str_a, "Hello world!\n"); 
8  printf(str_a); 
9 } 
(gdb) break strcpy 
Function "strcpy" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) y 
Breakpoint 1 (strcpy) pending. 
(gdb) break printf 
Breakpoint 2 at 0x8048300 
(gdb) run 
Starting program: /root/Desktop/Programs/exp 

Breakpoint 2, 0xb7eabf54 in printf() from /lib/i386-linux-gnu/i686/cmov/libc.so.6 
(gdb) i r eip 
eip   0xb7eabf54 0xb7eabf54 <printf+4> 
(gdb) cont 
Continuing. 
Hello world! 
[Inferior 1 (process 3726) exited with code 015] 
+7

Può essere ottimizzato e ridotto a codice inline, non una chiamata di funzione in realtà. Prova a compilare senza ottimizzazione. – Rohan

+0

@Rohan Ho usato 'gcc -g -O0 -o exp exp.c' ma non ha funzionato. –

+4

@ W.Zhu Controllare il codice dell'assieme. Scoprirai che anche con '-O0' non ci sono chiamate a' strcpy'. – kaylum

risposta

0

Il primo punto di interruzione è in sospeso.

(gdb) break strcpy 
Function "strcpy" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) y 
Breakpoint 1 (strcpy) pending.             <<here 

prova: (gdb) break 7

7 è il numero di riga.