Как присоединиться к уже запущенному процессу неинвазивно - PullRequest
1 голос
/ 04 июня 2009

У меня приостановлен процесс в точке останова под визуальным отладчиком студии. Я могу подключить столько, сколько cdb (консольный отладчик Microsoft) в неинвазивном режиме, как

cdb -p pid -pvr

Как добиться того же, используя мою собственную программу, которая использует Debug Engine API.

 IDebugClient* debugClient = 0;
(DebugCreate( __uuidof(IDebugClient), (void **)&debugClient );
 debugClient->AttachProcess(0,id,DEBUG_ATTACH_NONINVASIVE
                |DEBUG_ATTACH_NONINVASIVE_NO_SUSPEND);

Этот код вызывает E_INVALIDARG. Разве эта комбинация не разрешена? Нижеследующее работает, но когда он вызывает GetStackTrace, он возвращает E_UNEXPECTED.

debugClient->AttachProcess(0,id,DEBUG_ATTACH_NONINVASIVE);
debugControl->GetStackTrace(0, 0, 0, pStackFrames, maxFrames, &framesFilled);

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

Во-вторых, может ли кто-нибудь указать мне функцию, используемую для сброса содержимого памяти для символа итеративно, как это делает! Stl. Мне нужно написать плагин для дампа одной из моих структур, похожих на векторные.

Спасибо

1 Ответ

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

Я полагаю, что нет ничего плохого в

DEBUG_ATTACH_NONINVASIVE|DEBUG_ATTACH_NONINVASIVE_NO_SUSPEND 

комбинация - это вполне допустимо и даже показано в примере assert. В противном случае, что касается документации - это не так подробно. Я бы предложил отладку вашего расширения с помощью wt (данные трассировки и наблюдения) - это особенно полезно, когда вам нужно найти точную подпрограмму, которая возвращает ошибку, которая может помочь вам лучше понять проблема.

Что касается удаленного доступа к типизированным данным в ваших приложениях из расширения, я нашел класс ExtRemoteTyped (доступный в engextcpp.hpp в подпапке sdk) очень полезным и интуитивно понятным в использовании.

...