Как распечатать смещения регистров в точке трассировки Visual Studio? - PullRequest
2 голосов
/ 01 декабря 2011

Я использую Visual Studio точку трассировки в функции, которой я не являюсь (часть Windows user32.dll), и я хочу распечатать параметры функции.

Если бы у меня был исходный код функции, я мог бы использовать следующий синтаксис.

В функции ({arg1}, {arg2}), вызванной из $ CALLER

Однако у меня нет отладочной информации для user32.dll, поэтому я не могу ссылаться на arg1. В окне просмотра я могу видеть переменные путем смещения из регистра (*(int*)(ESP+4)), но я не могу понять, как это сделать в опции печати точки трассировки.

Когда я пытаюсь сделать следующее:

In Функция ({* (int *) ($ ESP + 4)}, {* (bool *) ($ ESP + 8)}) вызывается из $ CALLER

Я получаю: В функции (,), вызываемой из OtherFunction

Есть идеи, если это возможно?

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Если я что-то упустил, у меня это работает:
In foo: ({*(int*)($ESP+4)},{*(int*)($ESP+8)}) called from $CALLER
Дает мне ровно две инт, которые я прошел.

2 голосов
/ 01 декабря 2011

Не уверен, возможно ли это в Visual Studio. По крайней мере, документированные возможности для точек трассировки, похоже, не охватывают то, что вам нужно.

Одним из альтернативных решений будет использование WinDbg (входит в Средства отладки для Windows . С WinDbg вы можете, например:

bp kernel32! CreateFileW "du poi (@ esp + 4); gc"

Эта команда:

  1. Устанавливает точку останова для интересующей вас функции ( bp ).
  2. При попадании в точку останова выполняет часть в "". Это распечатывает интересующий вас параметр и продолжает отладку. То есть для примера CreateFile:

du - выводит строку юникода по адресу, указанному ( poi ) с помощью (@ esp + 4)

gc - команда возобновляет выполнение с условной точки останова тем же способом, который использовался для достижения точки останова (пошаговое выполнение, трассировка или произвольное выполнение).

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ: После удаленного ответа Асафа Леви (я хотел проголосовать за него, потому что это помогло с обучением чему-то / дал мне толчок попробовать это снова в VS :-). К сожалению, он был быстрее с удалением, чем я был с голосования.

Мне удалось заставить работать трассировку для CreateFile (имя файла) аналогично тому, как я это делал в WinDbg в Visual Studio (для справки я использую 2010). Что я сделал:

  1. Я выбрал «Перейти к разборке», находясь в отладчике, и перешел к вызову CreateFileW. Я взял имя функции оттуда (то есть _CreateFileW @ 28).
  2. Я зашел в окно точек останова, выбрал New -> Break at function ... (Ctrl + B). Введено имя (_CreateFileW @ 28). Я также попробовал способ WinDbg (kernel32! CreateFileW), но он не работает (не поддерживается?)
  3. Выбрал «Когда нажата ...» в точке останова и ввел: «CreateFileW FileName: {* ((const wchar_t **) (@ esp + 4))}», выбрано «Продолжить выполнение».

С моим тестовым кодом сейчас что-то в строках:

CreateFileW FileName: 0x7efddc00 "c: \ Temp \ test.out"

распечатывается для вызова CreateFile.

Так что в принципе это работает / должно работать в VS также. Требуется немного возиться, но это работает.

EDIT2: Также Это может помочь / упростить ситуацию, если вы настроите использование «Серверов Microsoft Symbol». Пожалуйста, смотрите: Используйте сервер символов . Его также можно настроить для работы без серверов символов, но при создании точки останова необходимо адаптировать шаг 1 и использовать адрес вместо символьного имени.

...