2014-04-04 21 views
5

Piszę oprogramowanie, które wykonuje dość skomplikowaną analizę statyczną i dynamiczne śledzenie innych programów. Ten program używa wielu statycznych informacji DWARF do pomocy w śledzeniu, w tym informacji o linii/kolumnie z sekcji DWARF .debug_line. Aby ten program miał dokładność, jakiej potrzebujemy, musi zawierać dokładne i dokładne informacje o numerze wiersza i kolumny, które należy wypełnić w informacji o debugowaniu DWARF. Korzystanie z clang Mogę wymusić zapełnienie informacji o wierszach i kolumnach przy użyciu razem opcji -g -Xclang -dwarf-column-info.Jak uzyskać dokładniejsze informacje o debugowaniu wiersza/col z klang?

Jednak są pewne przypadki, w których klang nie dostarcza drobnoziarnistych informacji o kolumnach. Jeden szczególny przypadek dotyczy pętli for. Weźmy następujący przykład program, który odniosę się do jak 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 } 

mogę skompilować go tak:

clang -g -Xclang -dwarf-column-info source01.c 

która produkuje wykonywalny a.out. Następnie używać dwarfdump aby sprawdzić, w jaki sposób informacje wiersz/kolumna została wypełniona:

dwarfdump a.out > dwarf_info 

Przyjrzeniu sekcji .debug_line, widzę wszystkich par wiersz/COL, które są zawarte w informacji debugowania to wykonywalnego:

.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 

Jak widać, istnieje para (5,10), co odpowiada int i=0;, a para (5,27), co odpowiada ++i. Jednakże, oczekiwałbym (i potrzebuję), aby była również para (5,19), która odpowiadałaby i < 10, ale jej tam nie ma. Sprawdziłem instrukcje pliku wykonywalnego za pomocą objdump i potwierdziłem, że rzeczywiście istnieją instrukcje, które odpowiadają porównaniu i < 10 (w związku z tym nie został on "zoptymalizowany").

Czy masz intuicję, dlaczego klang nie wypełni tych informacji? Czy istnieje sposób na wymuszenie clang, aby uzyskać bardziej szczegółowe informacje o kolumnie? Wygląda na to, że powinna mieć taką możliwość, ponieważ AST, które generuje clang, ma bardzo precyzyjne odwzorowania między sobą a wierszem kodu źródłowego i kolumnami.

Dziękuję.

+1

W związku z tym, że jest to bardzo bez odpowiedzi: ostatnio miałem podobnie niszowe pytanie dotyczące Clang i zdecydowałem się spróbować w [kod źródłowy] (http://clang.llvm.org/get_started.html). Nie mam doświadczenia w kompilatorach i nie znam nawet C++, ale odkryłem, że jest to niezwykle łatwe do znalezienia tego, czego potrzebowałem (proszę nie brać tego jako "Jestem sprytniejszy od ciebie" - naprawdę byłem onieśmielony przez to zacząć od). Może twój problem jest trudniejszy niż mój, ale daj mu szansę! Możesz również poprosić o [listę adresową] (http://clang.llvm.org/get_involved.html). I nie zapomnij odpowiedzieć na własne pytanie po ... – Brendan

+0

@Brendan Dzięki za komentarz! Tak, my (mój zespół i ja) rozważaliśmy przebadanie się przez źródło i dokonanie pewnych modyfikacji, aby uzyskać informacje, które chcemy. Zdecydowanie możemy zakończyć tę trasę w przyszłości. Zrobiłem również post do cfe-users (no-response), ale jeszcze nie próbowałem pisać do cfe-dev. – bddicken

Odpowiedz

0

Nie jest to rozwiązanie, tak jak wymówka, ale ...

Uważam, że pierwsza pozycja (5, 8) zawiera kod dla obu inicjatora i stan instrukcji w pętli for. Kiedy kompiluję program z pętlą for, te dwie instrukcje kończą się ciągłym zakresem adresów.

Byłoby miło zmuszać klang do generowania oddzielnego wpisu dla każdej wypowiedzi, ale nie mogę znaleźć niczego, co by to zrobiło.