[C++] Come posso ottenere la traccia dello stack lua da un file core usando gdb


Answers

Questa è una piccola variante dello script GDB di Michael Anderson: dovevo usarlo perché stavo ricevendo Cannot access memory at address 0x656d errori con il suo script, a causa del fatto che L->base_ci non è valido nel mio core dump. Questo inizia dal frame superiore ( L->ci ) e scende, nella direzione opposta, evitando il puntatore L->base_ci non valido.

set $p = L->ci
while ($p > L->base_ci )
  if ( $p->func->value.gc->cl.c.isC == 1 )
    printf "0x%x   C FUNCTION ", $p
    output $p->func->value.gc->cl.c.f
    printf "\n"
  else
    if ($p->func.tt==6)
      set $proto = $p->func->value.gc->cl.l.p
      set $filename = (char*)(&($proto->source->tsv) + 1)
      set $lineno = $proto->lineinfo[ $p->savedpc - $proto->code -1 ]
      printf "0x%x LUA FUNCTION : %d %s\n", $p, $lineno, $filename
    else
      printf "0x%x LUA BASE\n", $p
    end
  end
  set $p = $p - 1
end
Question

Ho un'applicazione C ++ (per OS X) che chiama lua come linguaggio di scripting. Sto eseguendo un gran numero di queste applicazioni (100s) e possono funzionare per un tempo molto lungo (giorni o settimane).

A volte uno si blocca. E quando si blocca, mi lascia un bel file principale.

Posso aprire questo file core in gdb e trovare dove si blocca l'applicazione. Posso camminare sullo stack delle chiamate e trovare un'istanza di una variabile lua_State. Il mio problema è che mi piacerebbe vedere come appare lo stack di chiamate lua in questo momento ...

Tieni presente che dal momento che questo è un core, non ho accesso alle chiamate alle funzioni C, il che esclude molti dei soliti metodi di debug degli script lua.

Mi piace evitare di aggiungere tracce manuali tramite i bachi di debug perché sono preoccupato per le penalizzazioni delle prestazioni aggiuntive e per la complessità aggiunta.

Come posso attraversare le strutture interne di lua per ottenere informazioni sullo stack delle chiamate?




Puoi controllare i miei aiutanti Lua GDB . È una raccolta di macro che consente di ispezionare stack e valori e persino di stampare backtrace. Essenzialmente ciò che l'articolo a cui fa riferimento Macs contiene, in un pacchetto semplice da usare.

Fornisce queste macro:

  • luastack [L] - elenca i valori sullo stack Lua C corrente.

  • luaprint < value > [verbose] - Pretty - stampa un TValue passato come argomento. Si aspetta un puntatore a un TValue. Quando verbose è 1, espande le tabelle, i metatables e gli ambienti userdata.

  • luaprinttable < table > - Pretty-prints a Lua Table. Si aspetta un puntatore alla tabella.

  • luavalue < index > [L] - Scarica un singolo valore in un indice.

  • luatraceback [L] - Chiama debug.traceback() . Non sono sicuro se funzionerà sul file principale anche se ...