Как остановить приложение C ++ во время выполнения для отладки в DLL? - PullRequest
4 голосов
/ 02 июня 2009

У меня есть приложение, для которого у меня нет кода, и DLL, для которого у меня есть код. Мне нужно иметь возможность отладки в DLL, но не хватает исходного файла для EXE, как мне это сделать?

Код DLL - это MFC C ++; Я считаю, что основное приложение тоже самое.

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

Я думаю, что должен быть какой-то вызов, позволяющий dll вращаться бесконечно, пока отладчик не присоединится к процессу, и в этот момент я смогу отладить dll, подключившись к процессу. Имеет ли это смысл? Есть ли лучший способ сделать это?

Ответы [ 11 ]

4 голосов
/ 02 июня 2009

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

#ifdef DEBUG
if (... file exists...) {
    DebugBreak();
}
#endif

Это остановит выполнение приложения, пока вы не подключите отладчик или не завершите работу приложения.

2 голосов
/ 02 июня 2009

Если приложение связано с не отладочной DLL-библиотекой и само не имеет отладочных символов, это вряд ли будет плодотворным. Возможно, вы захотите поискать здесь для получения информации об использовании пакетов символов Windows, чтобы помочь вам, если вам интересно, что происходит внутри библиотек DLL Windows, но в общем и целом, в приложении, которое не имеет отладочной информации и которое Вы не можете скомпилировать, не может быть отлажено каким-либо значимым образом.

2 голосов
/ 02 июня 2009

Существует параметр реестра ImageFileExecutionOptions, который можно настроить для запуска отладчика при загрузке вашей DLL. Я использовал его для отладки расширений ISAPI. Вот ссылка на достойную запись в блоге об этом .

1 голос
/ 15 июня 2009

Мне недавно пришлось использовать один из методов, перечисленных здесь: http://blogs.msdn.com/greggm/archive/2004/07/08/177418.aspx

Это помогает?

1 голос
/ 02 июня 2009

Убедитесь, что приложение действительно использует созданную вами DLL в режиме отладки с символами. Вы можете проверить это с помощью такой программы, как Process Explorer (в этом приложении включите нижнюю панель в меню «Вид» и выберите DLL).

Затем в меню отладки Visual Studio выберите «Присоединить к процессу» и выберите приложение, которое использует вашу DLL. Ваши точки останова отладки должны быть заполнены, если и когда ваша DLL загружена.

1 голос
/ 02 июня 2009

Подождите, пока присутствует отладчик:

while(!IsDebuggerPresent())
{
  Sleep(0);  // yield
}

MSDN Документация: IsDebuggerPresent().

1 голос
/ 02 июня 2009
__asm int {3};

в вашей главной DLL. Затем присоединить отладчик к процессу? Если это убивает процесс, то он, вероятно, имеет собственную ловушку int3 и завершает работу. Вы пытаетесь отладить игру, защищенную от копирования, или что-то подобное? Как они склонны к такому обманчивому поведению.

1 голос
/ 02 июня 2009

В случае проекта DLL вы должны указать Visual Studio запустить отладку, и он запросит имя исполняемого файла. Введите свой exe там. Я много делал это, когда работал над кодом DLL, который вызывался из другого процесса. Работает как с прямыми DLL, так и с компонентами COM.

Может также помочь установить некоторые контрольные точки в вашем коде заранее, если вы знаете, где может быть проблема.

Обновление: Поскольку это не работает для вас, единственное, о чем я могу думать, это присоединиться к работающему exe, но это может быть проблематично, если ваш код загружается до того, как вы шанс попасть туда.

0 голосов
/ 04 июня 2009

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

Запуск процесса внутри отладчика заставляет Windows включить NT кучу отладки . Похоже, что приложение или DLL имеет повреждение кучи или зависит от значения неинициализированной памяти кучи.

Вы можете отключить кучу отладки NT, установив для переменной среды _NO_DEBUG_HEAP значение 1 (в XP и более поздних версиях). Это может сделать возможным, чтобы приложение не погибало ужасной смертью при запуске из отладчика.

Запуск приложения вне отладчика также приведет к отключению кучи отладки NT, а последующее подключение отладчика не включит его.

0 голосов
/ 02 июня 2009

Я думаю, что должно быть какое-то вызов, чтобы позволить DLL вращаться до тех пор, пока отладчик прилагается к процессу, при котором Я должен быть в состоянии отладить DLL, приложив к процессу. Есть ли Это имеет смысл? Есть ли способ лучше сделать это?

Почему бы не сделать это так, как вы это описываете? Просто запустите приложение, которое вы хотите отладить. Подключите к нему отладчик, либо через Visual Studio, либо просто щелкнув правой кнопкой мыши приложение в диспетчере задач и выбрав «Отладка». Как только отладчик подключен, установите точку останова с помощью F9 в подходящем месте в вашем коде DLL.

...