Come stampare automaticamente le prossime N righe in GDB?

Ho cercato di trovare un modo per un po ‘di tempo per automatizzare i progressi in GDB di tracciare il stream di controllo di un programma.

Anche solo un semplice modo di automatizzare il comando n modo da poter vedere in quale ordine vengono chiamate le routine.

Mi rendo conto che puoi rilasciare nx dove x è il numero di volte in cui GDB attraversa, ma il problema è che mostra il comando ma non l’indirizzo della routine! Ma se si preme n manualmente in GDB (quindi si preme il tasto invio per emettere il comando precedente) viene visualizzato l’indirizzo.

Ho provato quanto segue in GDB:

 (after setting a breakpoint at say 0x0123456) b *0x0123456 

GDB dice . Io digito:

     commands 1 n 1000 c end 

    ma non loop come previsto, e non mostra la posizione dell’indirizzo :-(.

    Qualsiasi aiuto sarebbe apprezzato! Sicuramente deve essere semplice registrare automaticamente le routine dell’ordine sono chiamate ??

    Questo è facile, in realtà. Ti darò le ossa nude e potrai modificarle per adattarle.

     (gdb) define nstep > set $foo = $arg0 > while ($foo--) > step > end > end (gdb) nstep 100 

    L’ho fatto molte volte. Spero che questo ti aiuti!

    Che ne dici di usare strace per le chiamate di sistema e ltrace per le chiamate in libreria per vedere le tracce invece di usare gdb? strace per le chiamate di sistema e ltrace per le chiamate alle librerie funzionano con qualsiasi applicazione, anche se non si dispone del codice sorgente.

    Se si ha accesso al codice sorgente, è ansible anche utilizzare il proprio codice per eseguire le tracce. Gcc ha una modalità che ti permette di farlo. Ecco un esempio .

    Quindi dovresti solo analizzare i file di registro.

    Se si desidera utilizzare un semplice GDB, è ansible utilizzare gli elenchi dei comandi di Breakpoint

    Puoi dare a qualsiasi punto di interruzione (o punto di osservazione o punto di cattura) una serie di comandi da eseguire quando il programma si arresta a causa di quel punto di interruzione. Ad esempio, potresti voler stampare i valori di determinate espressioni o abilitare altri punti di interruzione.

    E in particolare:

    ad esempio, ecco come utilizzare i comandi breakpoint per stampare il valore di x alla voce foo ogni volta che x è positivo.

     break foo if x>0 commands silent printf "x is %d\n",x cont end 

    C’è uno script di shell per chiamate di funzioni di tracciamento automatizzate con gdb:

    http://blog.superadditive.com/2007/12/01/call-graphs-using-the-gnu-project-debugger/

    Perché il collegamento è morto ora, sto postando una copia del testo qui (l’autore è Juan M. Bello Rivas – jmbr): http://web.archive.org/web/20090317091725/http://blog.superadditive.com / 2007/12/01 / call-grafici-con-il-gnu-progetto-debugger /

    Chiamate i grafici usando il GNU Project Debugger

    Chris Ball ha chiesto a tutti quelli a cui piace Unix per uno strumento che sarebbe quello di funzionare chiamate quali strace e ltrace sono rispettivamente per le chiamate di sistema e di libreria.

    Volevo scriverlo da molto tempo, ma ciò che mi ha impedito di farlo è stato il fatto che avevo inventato un banale script shell / awk che raggiungeva quasi lo stesso objective. Dato che quel piccolo programma è stato utile per qualcuno diverso da me, ho pensato di lucidarlo leggermente e postarlo qui.

    Lo scopo originale di questo strumento era stampare un grafico di chiamata da un determinato programma. Funziona prendendo il controllo di GDB e impostando automaticamente i punti di interruzione ad ogni chiamata di funzione. Ovviamente, l’eseguibile deve includere i simboli di debug (ovvero deve essere stato compilato con l’opzione -g di gcc). Ecco alcuni esempi di output (il formato è: argomenti call callee):

     xmltree_parse xmltree_itor_next (self=0x80571e8) xmltree_itor_next xmlnode_stack_push (stack=0x80571f0, n=0x8056780) xmltree_parse h_requires (n=0x8056808, u=0xbff9d504) h_requires xmlnode_get_attr (self=0x8056808, name=0x80520ea "plugin") h_requires probe_get_name (self=0x8056af0) h_requires htab_lookup (self=0x8058100, key=0x8056868, len=3, create=0, value=0x0) 

    È ansible utilizzare lo script cg2dot.awk incluso per produrre file adatti per l’elaborazione con graphviz .

    Il programma (dimensione archivio 2110 byte, md5 54b583e637d19be0502ccadfa6174756):

    http://web.archive.org/web/20110902010824/http://superadditive.com/software/callgraph.tar.gz

    Esegue il dump di tutte le funzioni dal programma e genera un file di comando gdb con punti di interruzione su ciascuna funzione. Ad ogni punto di interruzione, ” backtrace 2 ” e ” continue ” vengono eseguiti (tramite i commands ).

    Questo script è piuttosto lento sul grande progetto (~ migliaia di funzioni), quindi ho aggiunto un filtro alla lista delle funzioni (tramite egrep). È stato molto facile Uso questo script quasi ogni mese.

    PS: C’è una copia di callgraph.tar.gz per il caso in cui archive.org lo eliminerà dagli archivi. Usa xxd -r per ripristinare

     0000000: 1f8b 0800 825e 1d49 0003 ed58 7b73 db46 .....^.I...X{sF 0000010: 0ecf bfe2 a740 6835 926c ea69 2799 8b62 [email protected]'..b 0000020: 5f69 89b6 7927 4b3e 926a 9ab3 5497 2257 _i..y'K>.j..T."W 0000030: d2d6 14a9 922b 3b4e 93fb ec07 2ca9 97d3 .....+;N....,... 0000040: 34d3 995c 3bbd 1126 1391 c0e2 87c7 0258 4..\;..&.......X 0000050: ae3d 3708 26b1 3b9f 56bd e5d3 93af 4d35 .=7.&.;.V.....M5 0000060: a417 4747 f45b 7ff9 bcb6 f92b 45cf 1b47 ..GG.[.....+E..G 0000070: 4fea 757c 383c 7af1 fca8 fea4 563f 3c44 Ou|8..(z%hj 00000b0: 4765 fcef 25fc 63e1 8670 5981 5316 0411 Ge..%.c..pY.S... 00000c0: 58fc ce4d e035 25e4 db64 3167 b1eb fb5c X..M.5%..d1g...\ 00000d0: f03b 56f1 a2d9 89b2 8740 572c 9ef1 24e1 .;[email protected],..$. 00000e0: 5108 3c81 298b d9e8 01b0 b842 c17c 0dc6 Q.<.)......B.|.. 00000f0: 3163 108d c19b baf1 8469 2022 70c3 0740 1c.......i "[email protected] 0000100: a424 0a51 3b1a 0997 873c 9c80 0b1e ba44 .$.Q;....<.....D 0000110: 6bc5 1481 9268 2cee dd98 e172 1fdc 2489 k....h,....r..$. 0000120: 3cee 2222 f891 b798 b150 b882 2c8e 79c0 <."".....P..,.y. 0000130: 1284 298a 2903 d5ce 74d4 9234 e433 3700 ..).)...t..4.37. 0000140: 1e02 c996 22b8 e762 1a2d 04c4 2c11 31f7 ...."..b.-..,.1. 0000150: 0845 4300 1e7a c1c2 273f 960b 023e e399 .EC..z..'?...>.. 0000160: 1502 90b9 4a08 7691 601c e4ab 06b3 c8e7 ....Jv`....... 0000170: 63fa 6514 1cc2 cc17 a380 2753 0d7c 4ef0 ce......'S.|N. 0000180: a385 c0b5 0931 3d16 921e 4653 8d62 4830 .....1=...FS.bH0 0000190: bb84 c159 9246 bcf6 9060 2866 b434 a7d4 ...YF..`(f.4.. 00001a0: 8a2c 59d2 f6fd 349a 6dc7 83a9 1a2f e210 .,Y...4.m..../.. 00001b0: 8d32 a9e3 4798 3ac2 40ab 3f31 4f10 8f14 .2..G.:[email protected]?1O... 00001c0: c611 eee7 3d05 e845 21ed 2122 be92 1be8 ....=..E!.!".... 00001d0: a0d4 1d45 774c 0695 d644 1809 f438 f583 ...EwL...D...8.. 00001e0: 7663 bede e44c 944c 7186 c088 ad72 87e6 vc...L.Lq....r.. 00001f0: 31d7 ee46 5c31 f980 2d17 0a8e 1b31 8f62 1..F\1..-....1.b 0000200: 69f4 71bc 95d4 890b 03ec de99 f346 b70c iq.........F.. 0000210: 306d b8b2 7adf 996d a30d aa6e e3bb aac1 0m..z..m...n.... 0000220: 1bd3 b9e8 f51d c015 96de 75de 42ef 0cf4 ..........uB.. 0000230: ee5b f8a7 d96d 53bc c6f7 5796 61db d0b3 .[...mS...Wa.. 0000240: c0bc bcea 9846 5b03 b3db eaf4 db66 f71c .....F[......f.. 0000250: 4e51 b3db 73a0 635e 9a0e c23a 3d69 3203 NQ..sc^...:=i2. 0000260: 330d d43b 4390 4bc3 6a5d 2043 3f35 3ba6 3..;CKj] C?5;. 0000270: f356 8333 d3e9 12ea 19c2 ea70 a55b 8ed9 .V.3.......p.[.. 0000280: ea77 740b aefa d655 cf36 d085 36ea 757b .wt....U.6..6.u{ 0000290: 5db3 7b66 a125 e3d2 e83a 15b4 8c3c 30be ].{f.%...:...<0. 00002a0: c317 b02f f44e 479a d3fb 1883 257d 6cf5 .../.NG.....%}l. 00002b0: aede 5ae6 f985 0317 bd4e dbb0 6c44 3935 ..Z......N..lD95 00002c0: d03f fdb4 63a4 e630 b856 4737 2f35 68eb .?..c..0.VG7/5h. 00002d0: 97fa b921 f57a 8863 c965 9987 6f2e 0cc9 ...!.zce.o... 00002e0: 428b 7a17 41f4 9663 f6ba 949d 56af eb58 BzA.c....V..X 00002f0: f8aa 61b4 96b3 527e 63da 8606 ba65 da94 ..a...R~c....e.. 0000300: 9833 ab87 0628 b1a8 41b9 230c d4ec 1a29 .3...(..A.#....) 0000310: 0ea5 7d7b 7770 11bd f76d 63ed 4fdb d03b ..}{wp...mc.O..; 0000320: 8866 9317 c840 88e5 f28a a2cc e368 7213 [email protected] 0000330: ba33 76ac ae0e 1e55 51f8 18ae 21bf 07e5 .3v....UQ...!... 0000340: 4040 1d86 4daa 8a50 0124 e64d 2350 fb89 @@..M..P.$.M#P.. 0000350: 3b61 af20 bf52 c72d 365a 7d47 26e8 5ab7 ;a. .R.-6Z}G&.Z. 0000360: ceed 4aa5 3254 571a 1baa c63b 7736 0fb6 ..J.2TW....;w6.. 0000370: 95ff 2387 9fc0 b62f 1333 7667 d813 1134 ..#..../.3vg...4 0000380: 0e33 8477 d869 7565 cc69 38da 6ec8 c503 .3.w.iue.i8.n... 0000390: 0e2d e6dd 2615 e5cc ec18 c7f9 7ae6 f253 .-..&.......z..S 00003a0: 28bf 833c f17e c5e9 b5c1 57d0 0fdd 51c0 (..<.~....W...Q. 00003b0: a801 c71c 1b89 bd63 de42 4856 41aa 173e .......c.BHVA..> 00003c0: b1dc d1bb e7c7 aa0a 137f 04e5 32bb 7383 ............2.s. 00003d0: 32ce d919 b6e1 f1cf 0b5c 955a 6d9c 3cab 2........\.Zm.<. 00003e0: c340 ea7e c049 cbe6 5036 a050 0ca3 018e [email protected]~.I..P6.P.... 00003f0: bcd1 6232 c12e 1f40 f230 1b45 4132 c028 [email protected]( 0000400: 17a1 ff01 db76 800d 3ad8 7083 44f1 cc15 .....v..:.pD.. 0000410: a542 0a79 0255 9fdd 55c3 4510 649b f377 .ByU.UEd.w 0000420: 28b3 9fa1 f669 9ce5 703b d496 1b16 7050 (....i..p;....pP 0000430: c53c 1440 7b0c 7293 097f 192b 8e0a cfc5 .<[email protected]{.r....+.... 0000440: d109 5c14 121a 2238 f0d5 8dc4 e1e6 b8f1 ..\..."8........ 0000450: c366 9230 f239 8e77 5f4e e475 64cb c02a .f.0.9.w_N.ud..* 0000460: 9bd9 6bca f425 533e 1672 ff98 80c5 1c04 ..k..%S>.r...... 0000470: 9be1 d421 5879 4e54 146a 07e3 58fd 7176 ...!XyNT.j..X.qv 0000480: 4b22 288b 8d02 a97c bfa2 1f55 f8f0 4122 K"(....|...U..A" 0000490: 2be7 8673 d6ef b6ec dfa5 2430 7828 c433 +..s......$0x(.3 00004a0: 288f 711b 3153 d2ae 8a0f 4b38 b580 c56c (.q.1S....K8...l 00004b0: 3ad9 4af9 7f59 729a f09b 6acd 2cde 025c :.J..Yr...j.,..\ 00004c0: f4af b0d9 1cf8 57df 74c0 31ac 4b8a db71 ......Wt1.K..q 00004d0: 6f29 6fa1 88a3 80e6 ec79 fb54 cef0 c71b o)o......yT... 00004e0: 5351 3c57 e07e af80 e1f5 6b03 0760 8279 SQ..7.....R..KZ 00006f0: e672 a9b9 b64c a1ad 5cd8 ca13 d535 16b2 .r...L..\....5.. 0000700: f267 dfe9 7e0f 79eb fbff a4e1 47a2 820d .g..~.y.....G... 0000710: f3b5 6d7c e1fe 5f3b acbd fce4 fe7f f472 ..m|.._;.......r 0000720: 77ff ff23 28bb ff4f 684e 96c7 0a4e a71c w..#(..OhN...N.. 0000730: f327 2cb9 ced7 35c8 3786 695b af4e 945c .',...5.7.i[.N.\ 0000740: 36b4 7d9e 7ecc 9dc3 2f58 f839 79cc e09c 6.}.~.../X.9y... 0000750: 46a8 f4ca 2731 a8d1 72b9 74ae 2d85 9a14 F...'1..rt-... 0000760: 6960 f74f 6de3 0afb 2a97 5bf6 e140 0cb0 i`.Om...*.[..@.. 0000770: 1707 2a94 4f20 7d6a ca96 2405 79c0 cb87 ..*.O }j..$.y... 0000780: 060d bddc c795 271f e580 fab3 d3f8 97a5 ......'......... 0000790: 75ff d32d a8e2 fd2f 6c7c a9ff 8f1a f547 u..-.../l|.....G 00007a0: fddf 7851 abef faff 8fa0 bdec 0f35 f03a ..xQ.........5.: 00007b0: 113e 8f2a d313 658b 15f0 11f1 9484 feec .>.*..e......... 00007c0: e5c1 5dc4 7dba 2217 a9f7 e8bb 6593 3f72 ..].}.".....e.?r 00007d0: e3cf f0df aff8 7883 10ca cce5 a1e4 e097 ......x......... 00007e0: 9ba7 c9bf 03c2 3e3e df5d 0fe9 fb28 4706 ......>>.]...(G. 00007f0: 1a87 b43a 4757 9b22 5d82 6eec 7eab 65d8 ...:GW."].n.~.e. 0000800: 76fa 9520 7195 b523 a445 e6c3 b558 59bb v.. q..#.E...XY. 0000810: 934a df3f 92be df90 a69f 50bb 49b2 a31d .J.?......PI.. 0000820: ed68 473b dad1 8e76 b4a3 1ded 6847 3bda .hG;...v....hG;. 0000830: d18e fe0f e9bf e4d9 0494 0028 0000 ...........(.. 

    Fenris , è lo strumento che stai cercando, non gdb. Homepage di Fenris

    Scritto dal leggendario Michal Zalewski , è esattamente ciò che stai cercando.

    Ecco il mio tentativo di qualcosa di simile, utilizzando la API gdb python – c – GDB auto stepping – stampa automatica delle linee, mentre free running?

    Ho creato uno script per farlo in modo specifico, automatizza gdb per inviare “s” e quindi legge l’output di gdb, continuamente, e quindi restituisce il risultato a un file di testo e al terminale.

    Lo script è in C, ed è pubblicato sul mio blog.

    http://www.codeground.net/coding/gdb-step-into-all-lines-to-get-full-application-flow/

    Sono arrivato a questa domanda mentre cercavo quello script, e non sono riuscito a trovare qualcosa di esattamente simile, quindi spero che questo aiuti qualcun altro.

     wget http://www.codeground.net/downloads/gdbwalkthrough.c gcc gdbwalkthrough.c -o gdbwalkthrough ./gdbwalkthrough  [application arguments] 

    Questo script può essere facilmente modificato per passare solo attraverso un insieme di linee o per eseguire solo un numero predefinito di volte, basta sostituire

     while(1) writeDebugger("s",NULL); 

    con questo

     int x=1000; while(x--) writeDebugger("s",NULL); 

    AFAIK, non è facile automatizzare gdb. Puoi provare a capire , per vedere se la piccola quantità di scritiability ti può aiutare.

    Puoi provare ad automatizzare gdb / MI con qualche script previsto.

    Nei debugger automatizzati, i’vd ha trovato che il dbx di Sun era il migliore. Ha un ‘ksh’ integrato in esso. È disponibile su Linux