[pykd] fixed: issue 8470 ( python.exe crashes after first pykd call )

git-svn-id: https://pykd.svn.codeplex.com/svn@63970 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\kernelnet_cp 2011-04-14 12:28:22 +00:00
parent 5371048a72
commit 1d27cb91d7
9 changed files with 92 additions and 104 deletions

49
pykd/dbgclient.h Normal file
View File

@ -0,0 +1,49 @@
#pragma once
#include "dbgext.h"
#include "dbgeventcb.h"
///////////////////////////////////////////////////////////////////////////////
class dbgClient {
public:
dbgClient()
{
IDebugClient4 *client = NULL;
DebugCreate( __uuidof(IDebugClient4), (void **)&client );
m_ext = new DbgExt( client );
}
~dbgClient()
{
removeEventsMgr();
delete m_ext;
}
void startEventsMgr() {
m_callbacks = new DbgEventCallbacksManager( m_ext->client );
}
void removeEventsMgr() {
if ( m_callbacks )
{
delete m_callbacks;
m_callbacks = NULL;
}
}
private:
DbgExt *m_ext;
DbgEventCallbacksManager *m_callbacks;
};
extern dbgClient g_dbgClient;
///////////////////////////////////////////////////////////////////////////////

View File

@ -6,9 +6,14 @@
#include "dbgdump.h" #include "dbgdump.h"
#include "dbgexcept.h" #include "dbgexcept.h"
#include "dbgeventcb.h" #include "dbgeventcb.h"
#include "dbgsession.h"
#include "dbgsystem.h" #include "dbgsystem.h"
#include "dbgcmd.h" #include "dbgcmd.h"
#include "dbgclient.h"
/////////////////////////////////////////////////////////////////////////////////
static
bool dbgStarted = false;
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
@ -20,16 +25,10 @@ dbgLoadDump( const std::wstring &fileName )
try { try {
if ( dbgExt ) if ( dbgStarted || isWindbgExt() )
return false; return false;
IDebugClient4 *client = NULL; g_dbgClient.startEventsMgr();
hres = DebugCreate( __uuidof(IDebugClient4), (void **)&client );
if ( FAILED( hres ) )
return false;
dbgExt = new DbgExt( client );
new DbgEventCallbacksManager( (IDebugClient*)client );
hres = dbgExt->client4->OpenDumpFileWide( fileName.c_str(), NULL ); hres = dbgExt->client4->OpenDumpFileWide( fileName.c_str(), NULL );
@ -40,6 +39,8 @@ dbgLoadDump( const std::wstring &fileName )
if ( FAILED( hres ) ) if ( FAILED( hres ) )
throw DbgException( "IDebugControl::WaitForEvent failed" ); throw DbgException( "IDebugControl::WaitForEvent failed" );
dbgStarted = true;
return true; return true;
} }
catch( std::exception& ) catch( std::exception& )
@ -62,16 +63,10 @@ startProcess( const std::wstring &processName )
try { try {
if ( dbgExt ) if ( dbgStarted || isWindbgExt() )
return false; return false;
IDebugClient4 *client = NULL; g_dbgClient.startEventsMgr();
hres = DebugCreate( __uuidof(IDebugClient4), (void **)&client );
if ( FAILED( hres ) )
return false;
dbgExt = new DbgExt( client );
new DbgEventCallbacksManager( (IDebugClient*)client );
ULONG opt; ULONG opt;
hres = dbgExt->control->GetEngineOptions( &opt ); hres = dbgExt->control->GetEngineOptions( &opt );
@ -94,6 +89,8 @@ startProcess( const std::wstring &processName )
if ( FAILED( hres ) ) if ( FAILED( hres ) )
throw DbgException( "IDebugControl::WaitForEvent failed" ); throw DbgException( "IDebugControl::WaitForEvent failed" );
dbgStarted = true;
return true; return true;
} }
catch( std::exception& e ) catch( std::exception& e )

View File

@ -14,38 +14,23 @@ DbgEventCallbacksManager::DbgEventCallbacksManager( IDebugClient *client )
{ {
HRESULT hres; HRESULT hres;
m_debugClient = NULL;
try { try {
if ( client == NULL ) m_debugClient = client;
{ m_debugClient->AddRef();
// ñëó÷àé, êîãäà ìû ðàáîòàåì â windbg. Ìû íå õîòèì ìåíÿòü ïîâåäåíèå êëèåíòà îòëàä÷èêà - îí
// äîëæåí ïðîäîëæàòü îáðàáîòêó ñîáûòèé, ïîýòîìó ìû ñîçäàåì ñâîåãî êëèåíòà
hres = DebugCreate( __uuidof(IDebugClient4), reinterpret_cast<PVOID*>(&m_debugClient));
if (FAILED(hres))
throw DbgException( "DebugCreate failed" );
}
else
{
// ñëó÷àé, êîãäà ìû ðàáîòàåì îòäåëüíî.  ýòîì ñëó÷àå êëèåíò âåñü â íàøåì ðàñïîðÿæåíèè
hres =client->QueryInterface( __uuidof(IDebugClient4), reinterpret_cast<PVOID*>(&m_debugClient));
if (FAILED(hres))
throw DbgException( "DebugCreate failed" );
}
hres = m_debugClient->SetEventCallbacks(this); hres = m_debugClient->SetEventCallbacks(this);
if (FAILED(hres)) if (FAILED(hres))
throw DbgException( "IDebugClient::SetEventCallbacks" ); throw DbgException( "IDebugClient::SetEventCallbacks" );
} }
catch( std::exception& ) catch( std::exception& e)
{ {
//dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd error: %s\n", e.what() ); dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd error: %s\n", e.what() );
} }
catch(...) catch(...)
{ {
//dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd unexpected error\n" ); dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd unexpected error\n" );
} }
} }
@ -74,8 +59,6 @@ HRESULT DbgEventCallbacksManager::ChangeSymbolState(
__in ULONG64 Argument __in ULONG64 Argument
) )
{ {
DbgExt ext( m_debugClient );
if ((DEBUG_CSS_LOADS & Flags)) if ((DEBUG_CSS_LOADS & Flags))
{ {
if (Argument) if (Argument)

View File

@ -38,7 +38,7 @@ private:
private: private:
IDebugClient4 *m_debugClient; IDebugClient *m_debugClient;
}; };
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////

View File

@ -22,19 +22,20 @@
#include "dbgdump.h" #include "dbgdump.h"
#include "dbgexcept.h" #include "dbgexcept.h"
#include "dbgeventcb.h" #include "dbgeventcb.h"
#include "dbgsession.h"
#include "dbgcallback.h" #include "dbgcallback.h"
#include "dbgpath.h" #include "dbgpath.h"
#include "dbginput.h" #include "dbginput.h"
#include "dbgprocess.h" #include "dbgprocess.h"
#include "dbgsynsym.h" #include "dbgsynsym.h"
#include "dbgclient.h"
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// óêàçàòåëü íà òåêóùèé èíòåðôåéñ // óêàçàòåëü íà òåêóùèé èíòåðôåéñ
DbgExt *dbgExt = NULL; DbgExt *dbgExt = NULL;
static bool isWindbgExt(); // ãëîáàëüíûé êëèåíò
dbgClient g_dbgClient;
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
@ -399,16 +400,17 @@ private:
dbgIn din; dbgIn din;
sys.attr("stdin") = boost::python::object( din ); sys.attr("stdin") = boost::python::object( din );
g_dbgClient.startEventsMgr();
} }
~WindbgGlobalSession() { ~WindbgGlobalSession() {
Py_Finalize(); Py_Finalize();
g_dbgClient.removeEventsMgr();
} }
boost::python::object main; boost::python::object main;
DbgEventCallbacksManager callbackMgr;
static volatile LONG sessionCount; static volatile LONG sessionCount;
static WindbgGlobalSession *windbgGlobalSession; static WindbgGlobalSession *windbgGlobalSession;
@ -634,11 +636,12 @@ pycmd( PDEBUG_CLIENT4 client, PCSTR args )
DbgExt ext( client ); DbgExt ext( client );
if ( !std::string( args ).empty() ) if ( !std::string( args ).empty() )
{ {
try try
{ {
OutputReader outputReader( dbgExt->client );
boost::python::exec( args, WindbgGlobalSession::global(), WindbgGlobalSession::global() ); boost::python::exec( args, WindbgGlobalSession::global(), WindbgGlobalSession::global() );
} }
catch( boost::python::error_already_set const & ) catch( boost::python::error_already_set const & )
@ -676,7 +679,7 @@ pycmd( PDEBUG_CLIENT4 client, PCSTR args )
do { do {
OutputReader outputReader( dbgExt->client ); OutputReader outputReader( (IDebugClient*)client );
HRESULT hres = dbgExt->control->Input( str, sizeof(str), &inputSize ); HRESULT hres = dbgExt->control->Input( str, sizeof(str), &inputSize );

View File

@ -38,3 +38,5 @@ private:
extern DbgExt *dbgExt; extern DbgExt *dbgExt;
bool isWindbgExt();

View File

@ -1,27 +0,0 @@
#include "stdafx.h"
//#include "dbgext.h"
//#include "dbgeventcb.h"
//#include "dbgsession.h"
//
//DbgExt dbgGlobalSession;
//
//bool dbgSessionStarted = false;
//
//void
//dbgCreateSession()
//{
// IDebugClient4 *client = NULL;
// DebugCreate( __uuidof(IDebugClient4), (void **)&client );
//
// SetupDebugEngine( client, &dbgGlobalSession );
// dbgExt = &dbgGlobalSession;
//
// setDbgSessionStarted();
//}
//
//bool
//dbgIsSessionStart()
//{
// return dbgSessionStarted;
//}

View File

@ -1,19 +0,0 @@
#pragma once
//void
//dbgCreateSession();
//
//extern
//bool dbgSessionStarted;
//
//inline HRESULT setDbgSessionStarted()
//{
// HRESULT hres = DbgEventCallbacks::Start();
// if (SUCCEEDED(hres))
// dbgSessionStarted = true;
// return hres;
//}
//
//bool
//dbgIsSessionStart();

View File

@ -462,6 +462,10 @@
RelativePath=".\dbgcallback.h" RelativePath=".\dbgcallback.h"
> >
</File> </File>
<File
RelativePath=".\dbgclient.h"
>
</File>
<File <File
RelativePath=".\dbgcmd.h" RelativePath=".\dbgcmd.h"
> >
@ -510,10 +514,6 @@
RelativePath=".\dbgreg.h" RelativePath=".\dbgreg.h"
> >
</File> </File>
<File
RelativePath=".\dbgsession.h"
>
</File>
<File <File
RelativePath=".\dbgsym.h" RelativePath=".\dbgsym.h"
> >