Как получить более детальную информацию об отладке строк / столбцов из clang?
Я пишу программное обеспечение, которое выполняет довольно сложный статический анализ и динамическое отслеживание других программ. Эта программа использует много статической информации DWARF для помощи в трассировке, включая информацию о строках / столбцах из .debug_line
Раздел DWARF. Чтобы эта программа обладала необходимой нам точностью, она должна иметь точную и точную информацию о номерах строк и столбцов, которая должна быть включена в информацию об отладке DWARF. С помощью clang
Я могу заставить данные строки и столбца заполняться, используя -g -Xclang -dwarf-column-info
варианты вместе.
Тем не менее, в некоторых случаях clang не выдает достаточно детальную информацию о столбцах. Один конкретный случай для for
петли. Возьмите следующий пример программы, который я буду называть 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 }
Я могу скомпилировать это так:
clang -g -Xclang -dwarf-column-info source01.c
Который производит исполняемый файл a.out
, Я тогда использую dwarfdump
чтобы проверить, как заполняется информация о строке / столбце:
dwarfdump a.out > dwarf_info
Взглянув на .debug_line
В разделе я вижу все пары строк / столбцов, которые содержатся в отладочной информации этого исполняемого файла:
.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
Как видите, есть пара (5,10), которая соответствует int i=0;
и пара (5,27), которая соответствует ++i
, Тем не менее, я ожидаю (и нужно), чтобы была также пара (5,19), которая соответствовала бы i < 10
, но его там нет. Я проверил инструкции исполняемого файла с objdump
и подтвердили, что действительно есть инструкции, которые соответствуют сравнению i < 10
(Таким образом, он не был просто "оптимизирован").
У вас есть интуиция, почему Clang не заполняет эту информацию? Или есть способ заставить clang
произвести более детальную информацию о столбце? Это похоже на clang
должна иметь такую возможность, потому что AST, которые clang
генерирует чрезвычайно детализированные отображения между собой и строкой и столбцами исходного кода.
Спасибо.
1 ответ
Это на самом деле не решение, а оправдание, но...
Я считаю, что первая запись (5, 8) включает в себя код как для инициализатора, так и для операторов условия в цикле for. Когда я компилирую программу с циклом for, эти два оператора оказываются в непрерывном диапазоне адресов.
Было бы неплохо заставить clang генерировать отдельную запись для каждого оператора, но я не могу найти ничего, что могло бы сделать это.