2014-04-04 7 views
5

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

+1

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

+0

@ 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

Antwort

0

ist nicht wirklich eine Lösung so viel als Entschuldigung, aber ...

ich der erste Eintrag glauben (5, 8) Code sowohl für die Initialisierung und Bedingungsanweisungen in der for-Schleife enthält. Wenn ich ein Programm mit einer for-Schleife kompiliere, enden diese zwei Anweisungen in einem zusammenhängenden Bereich von Adressen.

Es wäre nett, Clang zu erzwingen, um einen separaten Eintrag für jede Aussage zu generieren, aber ich kann nichts finden, das das tun würde.

Verwandte Themen