Windbg: Как установить точку останова при одной из перегрузок функции С++?

У меня есть две перегрузки функции С++, и я хотел бы установить контрольную точку на одном из них:

0:000> bu myexe!displayerror
Matched: 00000000`ff3c6100 myexe!displayError (int, HRESULT, wchar_t *)
Matched: 00000000`ff3c60d0 myexe!displayError (int, HRESULT)
Ambiguous symbol error at 'myexe!displayerror'

Черт, мне было бы неплохо установить точки останова при всех перегрузках, но не могу понять, как:

0:000> bu myexe!displayerror*
Matched: 00000000`ff3c6100 myexe!displayError (int, HRESULT, wchar_t *)
Matched: 00000000`ff3c60d0 myexe!displayError (int, HRESULT)
Ambiguous symbol error at 'myexe!displayerror*'

Ответ 1

Try:

bu 0xff3c6100

Если я правильно помню, WinDbg позволяет также установить точки останова по адресу.

Ответ 2

Вы пробовали "bm myexe! displayerror"?

Ответ 3

bp @@(MyClass:: MyMethod) break on methods (полезно, если один и тот же метод перегружен и, следовательно, присутствует на нескольких адресах)

Ответ 4

bm myexe!displayerror

Это установит точки останова всех всех перегрузок, чем вы используете bc, чтобы очистить те, которые вы не хотите.

bc 1-3

Или просто отключите их

bd 1-3

Проблема с bm заключается в том, что точки останова, которые она производит, иногда не могут быть оценены и инициировать перерыв. Иногда раздражает.

Ответ 5

Поиск вашей dll для всех точек входа, соответствующих вашему символу

x myexe!displayerror

это выведет все символы, соответствующие строке поиска и их точкам входа, затем установите точку останова по адресу

bp ff3c6100 // for myexe!displayError (int, HRESULT, wchar_t *)

Это установит конкретную точку останова при ударе этого адреса, или вы установите bp на другой адрес. Вы можете установить точку останова только один раз, очистить точку останова и выйти

bp /1 ff3c6100

и вы также можете выполнять команды, такие как сброс стека вызовов, переменные и продолжение:

bp ff3c6100 "kb;dv;g"

Вы также можете просто открыть исходный код при подключении WinDbg, перейти к строке кода, на которой вы хотите установить точку останова, и нажать F9 (то же самое, что и в Visual Studio), она будет приостановлена ​​на некоторое время раньше устанавливая точку останова на этой линии, это предполагает, что у вас есть доступ к исходному коду.