Фильтрация разрывов по трассе стека - PullRequest
3 голосов
/ 08 января 2020

Я хочу взломать функцию, но только если она НЕ была вызвана из указанной c другой функции. Это потому, что для большинства вызовов есть одна или две функции, но я не заинтересован в их отладке.

Я заметил, что у точек останова есть опция Filter :

Screenshot showing a filter option in dropdown menu

Это то, что можно использовать для фильтрации трассировки и разбивки стека по его содержимому?

Ответы [ 2 ]

3 голосов
/ 08 января 2020

Я не думаю, что вы можете использовать фильтры для этого, исходя из этого: Использовать точки останова в отладчике Visual Studio В частности, фильтры точек останова предназначены для параллельных программ, и вы можете фильтровать по: MachineName, ProcessId, ProcessName, ThreadId или ThreadName.

Одно из предложений, которое я хотел бы сделать, чтобы получить что-то похожее на то, что вы хотите, - это добавить дополнительный параметр со значением по умолчанию к функции, в которую вы хотите перейти. Затем установите другое значение в тех местах, которые вы не хотите отслеживать, и используйте «Условное выражение» в точке останова, чтобы оно ломалось только на значение по умолчанию.

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

1 голос
/ 08 января 2020

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

Следовательно, Вы должны быть в состоянии установить точку останова как условие значения *(DWORD*)ESP (32-битный код) или *(QWORD*)RSP (64-битный код). Хотя я не проверял это.

Однако мой приведенный выше пример будет работать только в том случае, если точка останова установлена ​​в самом начале функции, до того, как вызываемая функция помещает какие-либо значения в стек или изменяет указатель стека. , Я не уверен, где Visual Studio устанавливает точку останова, если вы помещаете ее в первую инструкцию функции. Поэтому вам может потребоваться либо установить точку останова в окне разборки для первой инструкции ассемблера функции, либо вам может потребоваться компенсировать функцию, изменив указатель стека в прологе функции .

В качестве альтернативы, если правильный стековый фрейм был настроен с использованием регистра EBP (или RBP для 64-битного), то вы можете использовать его вместо этого.

Обратите внимание, что не адрес инструкции CALL будет помещен в стек, а точнее адрес возврата, который является адресом следующей инструкции уровня ассемблера вызывающей функции.

Я предлагаю вам сначала установить безусловную точку останова, где Вы хотите его и затем осмотрите стек, используя средство просмотра памяти в отладчике, в частности, чтобы увидеть, куда указывают значения ESP / RSP и EBP / RBP и где адрес возврата хранится в стеке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...