Как отладчики получают номера строк команд?

Я пытаюсь получить номера строк адреса, который я собрал в стеке, используя symgetlinefromaddr64, но я не могу получить адреса простых команд или их строк.
например, если я смотрю на метод:

void Test(int g)
{
  g++;
  DoSomething(g);
  g--;
}

Я получу только номер строки «DoSomething», но мне нужны номера строк «g++» и т. д. Я полагаю, что это выполнимо, потому что это делают отладчики. как я могу сделать это сам на С++ в Windows?


person la la lu    schedule 06.02.2011    source источник
comment
Это для кода сборки Release? Да, эти строки не генерируют никакого кода, например, тело функции транслируется в DoSomething(g+1).   -  person Hans Passant    schedule 06.02.2011
comment
нет, только отлаживать сборки...   -  person la la lu    schedule 06.02.2011


Ответы (2)


Проход по стеку будет извлекать только те адреса, которые хранятся в стеке, что в значительной степени означает вызовы функций. Если вам нужен адрес вашего g++ или g--, вам нужно будет использовать что-то другое, кроме обхода стека, чтобы получить их (например, SymGetFileLineOffsets64). Если вы начинаете со стека и у вас есть информация из SymGetLineFromAddr64, вы можете использовать SymGetLineNext64 и SymGetLinePrev64 для получения информации об окружающих линиях.

person Jerry Coffin    schedule 06.02.2011
comment
Но насколько я понимаю эти функции дают мне адрес из номера строки. Я хочу пойти наоборот. - person la la lu; 06.02.2011

Единственный способ сделать это - использовать сгенерированные компилятором файлы символов, такие как файлы *.pdb для компиляторов Microsoft Visual Studio (pdb означает базу данных программы). Эти файлы содержат все символы, используемые на этапе компиляции. Даже для компиляции релиза вы получите информацию об используемых символах (некоторые, возможно, были оптимизированы).

Основным недостатком является то, что это сильно зависит от компилятора. Например, gcc может включать информацию о символах в исполняемый файл so-file или исполняемый файл. Другие компиляторы имеют другие форматы...

Какой компилятор вы используете (название/версия)?

person jdehaan    schedule 06.02.2011
comment
Затем вы можете попробовать использовать эти pdb, что и делает отладчик. Нет pdb: нет отладки на уровне исходного кода, несоответствие pdb: тогда выделенные строки не соответствуют текущему состоянию отлаживаемой программы. Pdbs определенно содержат необходимую информацию. Но это не открытый формат. msdn.microsoft.com/en-us/library /yd4f8bd1(v=VS.90).aspx - person jdehaan; 06.02.2011