Domanda

Durante l'utilizzo di traccia, ho scoperto che alcune funzioni non sono elencati nel sorgente durante il tentativo di trovare loro al fine di mettere un punto di interruzione. Queste funzioni sembra apparire solo quando ho vista la sorgente in formato di montaggio.

Ho parlato con i miei anziani, mi hanno detto se qualsiasi funzione viene chiamata solo una volta, sarà ottimizzato da Trace e apparirà come in linea, quindi, può essere visto in assemblea.

Le mie domande sono:

  1. Come funziona questa ottimizzazione avviene attraverso Lauterbach?
  2. È vantaggioso ??
È stato utile?

Soluzione

Ci sono un paio di cose:

  1. Per quanto riguarda la dichiarazione ho scoperto che alcune funzioni non sono elencati nel sorgente durante il tentativo di trovare loro al fine di mettere un breakpoint ", basta controllare il file di mapping / Map file che si compone di diverse funzioni che sono stati utilizzati nella build, le loro posizioni in memoria, ecc e se non trovate la vostra funzione non c'è non solo esaminare l'ottimizzazione [Solo che potrebbe essere il problema].

  2. Come ha giustamente sottolineato, l'ottimizzazione non è fatto dalla Lauterbach ma è fatto dal compilatore. Normalmente, ci sono diversi livelli di ottimizzazione [in ARM abbiamo O0-O2] dove O0 è la massima ottimizzazione possibile, ma questo dovrebbe essere utilizzato solo quando v'è un rilascio per il livello di ottimizzazione altro cliente O2 dovrebbe essere utilizzato per il debug.

  3. Se si sente la funzione potrebbe essere ottimizzata dal compilatore, provare a fare lo volatili .

  4. Altro punto che potrebbe non essere [direttamente] legata a questo, ma potrebbe aiutare è quello di sapere "In quale area della memoria è il vostro file che si trova" in quanto molte volte, quando si desidera eseguire il debug qualcosa e che pagina è ancora non in RAM, non sarà in grado di mettere i punti di interruzione fino al momento in cui la pagina viene presa nella RAM [in sostanza, qualcosa come On-Demand paging se è presente nel vostro sistema]

Spero che questo aiuti.

-hjsblogger

Altri suggerimenti

L'ottimizzazione viene eseguita dal compilatore, non dal Lauterbach. Il compilatore cerca di ottimizzare la sua uscita linguaggio assembly, e le impostazioni di default in genere sarà funzioni che vengono chiamate solo una volta in linea.

Per ignorare queste ottimizzazioni per scopi di test, è possibile utilizzare il flag di compilazione -. No_inline

Inlining una funzione che solo viene chiamata una volta può essere fatto dal compilatore.

Il vantaggio è che si salva il sovraccarico di una chiamata di funzione (runtime, spazio di codice e lo spazio dello stack), e si può ancora scrivere il codice in modo modulare bello come diverse funzioni.

Lo svantaggio è che il debugging diventa più difficile, perché durante la funzione di debug si confonde con il chiamante.

W.r.t. il comportamento del vostro strumento traccia la tua domanda è piuttosto chiara.

Se c'è una funzione chiamata che non è possibile trovare nel codice sorgente che è improbabile che sia a causa di funzioni inline per 2 motivi:

  1. chiamate di funzione inline non vengono visualizzati come subroutine chiama nel codice assembly - il codice per implementare la funzione emesso linea nel punto in cui la chiamata di funzione sarebbe altrimenti (che è quello inlining è)

  2. quando il compilatore Inlines chiama la funzione, il nome della funzione (se si poteva vedere nella uscita di montaggio) sarebbe ancora in parte del codice sorgente -. È lì che il compilatore sarebbe sempre il codice di linea

Ma, a volte compilatori inseriscono misteriosa funzione chiamate a funzioni di supporto interne nel codice generato per implementare cose come operazioni aritmetiche che la CPU non supporta direttamente (operazioni di divisione intero o in virgola mobile, per esempio).

Quali sono i nomi delle 'funzioni mistero'?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top