Sto scrivendo software che esegue analisi statiche piuttosto complesse e tracciamento dinamico di altri programmi. Questo programma utilizza molte informazioni DWARF statiche per agevolare la traccia, incluse le informazioni di riga/colonna dalla sezione DWARF .debug_line
. Affinché questo programma abbia la precisione di cui abbiamo bisogno, è necessario che le informazioni sul numero di righe e colonne siano compilate in modo preciso e accurato nelle informazioni di debug di DWARF. Utilizzo di clang
È possibile forzare l'inserimento di informazioni su righe e colonne mediante le opzioni -g -Xclang -dwarf-column-info
.Come ottenere informazioni di debug su riga/colonna più dettagliate da clang?
Tuttavia, vi sono alcuni casi in cui il clang non produce informazioni di colonna abbastanza dettagliate. Un'istanza particolare è per i loop for
. Prendere il seguente programma di esempio che mi riferirò come source01.c
:
1
2 int main()
3 {
4 int number1 = 10, number2 = 20;
5 for (int i=0; i < 10; ++i) {
6 number1++;
7 number2++;
8 }
9 return 0;
10 }
posso compilarlo in questo modo:
clang -g -Xclang -dwarf-column-info source01.c
che produce l'eseguibile a.out
. allora io uso dwarfdump
di ispezionare come le informazioni riga/colonna è stata popolata:
dwarfdump a.out > dwarf_info
Dando uno sguardo alla sezione .debug_line
, vedo tutte le coppie di fila/COL, che sono contenute nelle informazioni di debug questo eseguibile:
.debug_line: line number info for a single cu
Source lines (from CU-DIE at .debug_info offset 0x0000000b):
<pc> [row,col] NS BB ET PE EB IS= DI= uri: "filepath"
NS new statement, BB new basic block, ET end of text sequence
PE prologue end, EB epilogue begin
IA=val ISA number, DI=val discriminator value
0x004004f0 [ 3, 0] NS uri: "/xxx/loop_01/source01.c"
0x004004fb [ 4, 5] NS PE
0x00400509 [ 5,10] NS
0x0040051d [ 6, 9] NS
0x00400528 [ 7, 9] NS
0x00400533 [ 5,27] NS
0x00400548 [ 9, 5] NS
0x0040054a [ 9, 5] NS ET
Come si può vedere, v'è la coppia (5,10), che corrisponde a int i=0;
, e la coppia (5,27), che corrisponde a ++i
. Tuttavia, mi sarei aspettato (e ho bisogno) di avere anche la coppia (5,19), che corrisponderebbe a i < 10
, ma non è lì. Ho controllato le istruzioni dell'eseguibile con objdump
e ho confermato che ci sono effettivamente istruzioni che corrispondono al confronto i < 10
(Quindi, non è stato semplicemente "ottimizzato via").
Avete intuito sul motivo per cui clang non popolare queste informazioni? O c'è un modo per forzare lo clang
per produrre informazioni più dettagliate sulle colonne? Sembra che clang
dovrebbe avere questa funzionalità, poiché gli AST che genera clang
hanno mappature estremamente fini tra se stesso e la riga e le colonne del codice sorgente.
Grazie.
Poiché questo sta andando molto senza risposta: Recentemente ho avuto una domanda di nicchia simile su Clang e ho deciso di provare a cercare nel [codice sorgente] (http://clang.llvm.org/get_started.html). Non ho esperienza con i compilatori e non conosco nemmeno il C++, ma ho trovato sorprendentemente facile trovare ciò di cui avevo bisogno (per favore non prendere questo come "Sono furbo di te" - ero intimidito da esso per iniziare con). Forse il tuo problema è più difficile del mio, ma provaci! In alternativa, chiedere sulla [mailing list] (http://clang.llvm.org/get_involved.html). E non dimenticare di rispondere alla tua stessa domanda dopo .. – Brendan
@Brendan Grazie per il commento! Sì, noi (io e il mio team) abbiamo pensato di scavare attraverso la fonte e apportare alcune modifiche per ottenere le informazioni che vogliamo. Sicuramente potremmo finire per percorrere quella strada in futuro. Ho anche inviato messaggi agli utenti di CFE (nessuna risposta), ma non ho ancora provato a postare su cfe-dev. – bddicken