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ę.
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
@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