Назначение функциональной точки останова для вызова функции Windows DLL / API - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь установить точку останова при каждом вызове функции kernel32.dll.Аналогично этому Получите стеки вызовов при вызове функции kernel32.dll

Я назначаю точку останова функции, но после назначения у нее есть символ, говорящий, что они никогда не будут нажаты, и онинет.Мне нужно сделать это в x86, но я не могу даже заставить этот простой 64-битный работать.

Я проверил «Серверы Microsoft Symbol» в Сервис-> Параметры / Отладка / Символы, но каталог кэша все еще пуст.Я думаю, что это проблема, но не уверен.Как убедиться, что символы отладки dll загружены правильно?

Пример кода.

using System;
using System.Runtime.InteropServices;
namespace DebugAPI
{
  class Program
  {
    [DllImport("kernel32.dll")]
    public static extern System.UInt32 GetCurrentProcessorNumber();

    static void Main(string[] args)
    {
      var num = GetCurrentProcessorNumber();
      Console.WriteLine("Proc# " + num.ToString());
    }
  }  
}

Я попробовал два способа сделать Точки останова для 64-битных функций.Kernel32! GetCurrentProcessorNumber {,, kernel32.dll} GetCurrentProcessorNumber

Для x86 я попробовал следующее {,, kernel32.dll} _GetCurrentProcessorNumber @ 4 // Не уверен, правильно ли @ 4

1 Ответ

0 голосов
/ 21 декабря 2018

Для записи здесь приведены полные шаги по настройке точек останова с использованием GetCorrent ProcessorNumber в качестве примера.Обратите внимание, что VS2017, похоже, содержит ошибку с целевой платформой x64.Должно быть x86 или anycpu.

  1. В Solution Explore щелкните правой кнопкой мыши «YourProject» -> «Свойства» -> «Отладка» -> «Включить отладку собственного кода» = флажок
  2. В главном меню «Отладка»-> Параметры-> Отладка-> Символы -> «Серверы Microsoft Symbol» = проверено.& назначить путь кеша
  3. Добавить отладку функциональной точки останова-> Новая точка останова-> Функциональная точка останова.

[Параметры имени]

[x86 & x64] - ФункцияName = Kernel32! GetCurrentProcessorNumber Language = All

[x86] Имя функции = {,, kernel32.dll) GetCurrentProcessorNumber Language = Все

[x86] Имя функции = _NtGetCurrentProcessorNumber @ 0 Language = All (Ссылка для # после @ https://stackoverflow.com/a/40031574/1132334 credit - dlatikay)

Примечание: при первой отладке загрузка символов занимает некоторое время.

...