In GDB, come posso passare direttamente al frame dello stack di chiamate più in alto?


9

Ho un programma in C che segna i guasti dopo essere sceso in profondità in un disordine ricorsivo infinito. Il backtracing del processo in GDB è inutile perché il frame dello stack di chiamate ha una profondità di almeno 1000 frame e le chiamate di funzione ripetute sono una serie di quattro chiamate di funzione ricorsive comuni (quindi i punti di interruzione sembrano inutili). Le chiamate ripetute a backtrace leggono semplicemente i quattro nomi delle funzioni, ancora e ancora e ancora. Mi è venuto in mente che fare 'su' 'su' 'su' ... mi avrebbe portato più in alto, così ho potuto vedere da dove è iniziato questo schema, ma sembra che sarebbe più efficiente iniziare dalla chiamata più in alto impilare il frame e scendere invece, perché il mio sospetto è che la ricorsione infinita inizia all'inizio del processo. Se lo stack di chiamate avesse un totale di N frame, so di poterlo fare

gdb>> up N

per arrivare in cima allo stack (l'ennesimo frame), ma il problema è che non conosco N. Esiste un comando per trovare il numero totale di frame nello stack delle chiamate? Oppure, c'è un comando GDB integrato per saltare al frame più in alto? Mi è venuto in mente che il frame più in alto dovrebbe essere la funzione main () - posso sfruttare quella conoscenza per arrivare al frame più in alto?

Risposte:


9

Nei miei test, l'uso di "up" con un numero molto elevato ha comportato la visualizzazione del frame più in alto, ad es

(gdb) up 99999
#58 0x0000000000442fb4 in main ()

1
Non funziona se la dimensione dello stack è superiore a 99999
Il Vivandiere

Questa risposta ha funzionato per me, avevo solo bisogno di usare un numero maggiore.
tesch1

23

Puoi specificare 'bt' con un numero negativo per iniziare dal frame più in alto:

bt -20

È quindi possibile utilizzare 'frame' (o 'f') per passare direttamente al frame desiderato.


1

fr 0ti porterà al frame più in alto dello stack. frsta per cornice.


2
questa è la direzione sbagliata
tesch1

@ tesch1 abbastanza giusto, ma backtrace gdb ti mostra il fondo in alto :)
Il Vivandiere
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.