Ich schreibe Software, die einige ziemlich komplexe statische Analyse und dynamische Verfolgung anderer Programme durchführt. Dieses Programm verwendet viele statische DWARF-Informationen zur Unterstützung bei der Ablaufverfolgung, einschließlich Zeilen-/Spalteninformationen aus der DWARF-Sektion .debug_line
. Damit dieses Programm die Genauigkeit hat, die wir benötigen, muss es feingranulare und genaue Zeilen- und Spaltennummerninformationen enthalten, die in den DWARF-Debugging-Informationen enthalten sein müssen. Mit clang
kann ich erzwingen, Zeilen- und Spalteninformationen unter Verwendung der Optionen -g -Xclang -dwarf-column-info
zusammen zu füllen.Wie erhalten Sie detailliertere row/col Debug-Informationen von clang?
Es gibt jedoch einige Fälle, in denen der Klang keine feinkörnigen Spalteninformationen liefert. Eine bestimmte Instanz ist für for
Schleifen. Nehmen Sie das folgende Beispiel-Programm, das ich als source01.c
beziehen:
clang -g -Xclang -dwarf-column-info source01.c
der die ausführbaren a.out
produziert:
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 }
ich es wie so zusammenstellen kann. Ich habe dann dwarfdump
verwenden zu untersuchen, wie die Zeilen/Spalten-info hat besiedelt:
dwarfdump a.out > dwarf_info
einen Blick auf dem .debug_line
Abschnitt nehmen, sehe ich alle Zeilen/col-Paare, die diese ausführbaren Datei in den Debug-Informationen enthalten sind:
.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
Wie Sie sehen können, gibt es das Paar (5,10), die int i=0;
entspricht, und das Paar (5,27), die ++i
entspricht. Allerdings würde ich dort (und muss) auch das Paar (5,19) erwarten, was i < 10
entsprechen würde, aber es ist nicht da. Ich habe die Anweisungen der ausführbaren Datei mit objdump
überprüft und bestätigt, dass es tatsächlich Anweisungen gibt, die dem Vergleich i < 10
entsprechen (also wurde es nicht einfach "wegoptimiert").
Haben Sie irgendeine Intuition, warum Clang diese Information nicht füllen würde? Oder gibt es eine Möglichkeit, clang
zu zwingen, feinkörnigere Spalteninformationen zu erzeugen? Es scheint, als ob clang
diese Fähigkeit haben sollte, weil die ASTs, die clang
generiert, extrem feinkörnige Zuordnungen zwischen sich selbst und der Quellcodezeile und -spalten haben.
Vielen Dank. Diese
Da dies sehr unbeantwortet bleibt: Ich hatte vor kurzem eine ähnliche Nischenfrage über Clang und entschied mich, in [Quelltext] (http://clang.llvm.org/get_started.html) zu suchen. Ich habe keine Erfahrung in Compilern und ich weiß nicht einmal C++, aber ich fand es überraschend einfach zu finden, was ich brauchte (bitte nimm das nicht als "Ich bin schlauer als du") - ich war wirklich davon eingeschüchtert beginnen mit). Vielleicht ist dein Problem härter als meins, aber probiere es aus! Alternativ fragen Sie auf der [Mailingliste] (http://clang.llvm.org/get_involved.html). Und vergiss nicht, deine eigene Frage zu beantworten, nachdem .. – Brendan
@ Brendan Danke für den Kommentar! Ja, wir (mein Team und ich) haben darüber nachgedacht, die Quelle zu durchforsten und einige Änderungen vorzunehmen, um die Informationen zu erhalten, was wir wollen. Wir können definitiv diese Route in der Zukunft beenden. Ich habe auch an cfe-Benutzer (no-response) gepostet, aber ich habe noch nicht versucht, auf cfe-dev zu posten. – bddicken