Как получить более детальную информацию об отладке строк / столбцов из 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 генерировать отдельную запись для каждого оператора, но я не могу найти ничего, что могло бы сделать это.

Другие вопросы по тегам