2015-04-06 8 views
5

Recentemente ho avuto un colloquio e mi è stato chiesto di progettare/implementare le funzionalità di stacktrace. Questo è quello che mi è venuto in mente.Come implementare la traccia dello stack quando si verifica un errore?

  • Mantiene uno stack che contiene tutte le chiamate di metodo dal punto di ingresso principale del programma.
  • Se si verifica un errore in qualsiasi momento durante l'esecuzione, interrompere il programma e stampare l'intero stack facendo scattare ogni elemento.

Mi è stato poi chiesto due domande:

  1. Come/dove sarebbe questo stack essere inizializzato?
  2. Come decidereste la quantità di dati che lo stack deve memorizzare senza eseguire OOM? Perché la JVM non esegue mai OOM a causa dello stack?

Per la prima domanda, la pila deve essere statica e deve essere inizializzata all'inizio del programma. Ma non ero sicuro della seconda domanda. Ho provato a leggere come fa la JVM ma era un po 'complesso. Ho provato a cercare su google le implementazioni di base ma non sono riuscito a trovarne. Lo apprezzerei molto se qualcuno mi indicasse la giusta direzione su cosa esattamente dovrei cercare per rispondere a questo.

+0

possibile duplicato del [Java dimensione dello stack di default] (http://stackoverflow.com/questions/20030120/java-default-stack-size) – ControlAltDel

+1

Look at Throwables printStackTrace() – user489041

+0

dispiace votato per chiudere, ma mi rendo conto questi due le domande non sono le stesse Puoi trovare molte informazioni sull'allocazione dello stack con questa domanda: http://stackoverflow.com/questions/20030120/java-default-stack-size – ControlAltDel

risposta

0

Un po 'una domanda a risposta aperta, ecco il mio prendere:

  1. Pila non deve essere statica - c'è uno stack per filo, non per programma, e le discussioni possono essere aggiunti e rimossi durante il programma di tutta la vita. Quindi gli stack devono essere allocati dinamicamente.
  2. uno stack Java può overflow. Che potrebbe essere diverso da OOM, ma non così diverso. Per quanto riguarda cosa archiviare nello stack, dovrei andare configurato dall'utente, poiché i requisiti sono molto diversi quando si esegue la modalità di sviluppo rispetto alla modalità di produzione. Potresti anche discutere dei possibili miglioramenti della gestione dello stack, come ad esempio tail-call optimizations. Ciò impedirebbe lo stack overflow, ma influenzerebbe in questo modo il codice scritto.

In ogni caso, il mio 2 ¢.

0

Non memorizzerei alcuna informazione di traccia di stack da nessuna parte poiché questa è già memorizzata nello stack frame di ogni thread. Quando è richiesta la traccia dello stack (ad esempio l'eccezione è generata), la compilerei dal frame dello stack.

Problema è che non sono sicuro se lo stack frame ha tutte le informazioni necessarie per farlo.

0

Chiama Thread.currentThread(). GetStackTrace() per restituire un StackElement [] che può essere stampato sul log.

+0

Non penso che questo fosse ciò che l'OP stava chiedendo riguardo –

Problemi correlati