Как отладчики получают номера строк команд? - PullRequest
0 голосов
/ 06 февраля 2011

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

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

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

Ответы [ 2 ]

0 голосов
/ 06 февраля 2011

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

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

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

0 голосов
/ 06 февраля 2011

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

...