Как я могу установить точку останова на моей функции и перечислить ее источник? - PullRequest
3 голосов
/ 08 мая 2011

Теперь я не могу установить bp на WinMain, хотя вижу разборку и не могу указать источник WinMain:

0:000> u WinMain
00401040 55              push    ebp
00401041 8bec            mov     ebp,esp
00401043 6a00            push    0
00401045 e87e0e0000      call    monitormt!g_thread_init (00401ec8)
0040104a 83c404          add     esp,4
0040104d e8700e0000      call    monitormt!gdk_threads_init (00401ec2)
00401052 e8650e0000      call    monitormt!gdk_threads_enter (00401ebc)
00401057 e8d4040000      call    monitormt!select_device (00401530)
0:000> ba WinMain
        ^ Unable to set breakpoint error
The system resets thread contexts after the process
breakpoint so hardware breakpoints cannot be set.
Go to the executable's entry point and set it then.
 'ba WinMain'

Как это сделать в windbg?

UPDATE

Кажется, bp работает, но почему ba нет?

1 Ответ

3 голосов
/ 08 мая 2011

Сообщение, отображаемое отладчиком, на самом деле довольно ясно объясняет, почему ba не будет работать на этом этапе. Инструкция ba устанавливает аппаратную точку останова. Аппаратные точки останова устанавливаются через регистры отладки . Регистры отладки являются частью контекста процессора, который устанавливается ОС. Вы только что загрузили процесс в память - вся структура памяти готова, но контекст процессора не был установлен. Если вы отладчик устанавливаете некоторые значения реестра прямо сейчас, эти изменения не будут иметь значения, потому что ОС будет переопределять все значения реестра при запуске процесса.

Программная точка останова (bp) лучше здесь, потому что она работает путем перезаписи инструкции по адресу, указанному вами для INT 3 инструкции. Очевидно, что это не зависит от изменения контекста процессора, так что работает в любое время, даже на начальной точке останова процессора.

Обходной путь прост - сначала выполните один шаг, используя инструкцию t, затем вы можете использовать аппаратные точки останова, как вам нравится. Для точки останова выполнения я бы рекомендовал использовать программные точки останова. Вы можете создать любое количество программных точек останова, в то время как количество аппаратных точек останова ограничено количеством регистров отладки.

...