From 9545cf5df0ce3e0d314a3a2663b6287d22860826 Mon Sep 17 00:00:00 2001 From: "SND\\kernelnet_cp" Date: Thu, 28 Jul 2011 06:51:01 +0000 Subject: [PATCH] [pykd] fixed: issue 9202 ( module object return offset = 0 for non existing symbol ) git-svn-id: https://pykd.svn.codeplex.com/svn@68357 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/dbgmodule.cpp | 306 +++++++++++++++++++-------------------------- pykd/dbgsym.cpp | 27 ++-- 2 files changed, 134 insertions(+), 199 deletions(-) diff --git a/pykd/dbgmodule.cpp b/pykd/dbgmodule.cpp index 59ce510..4ca1a06 100644 --- a/pykd/dbgmodule.cpp +++ b/pykd/dbgmodule.cpp @@ -17,31 +17,19 @@ loadModule( const std::string &moduleName ) { HRESULT hres; - try { - ULONG64 moduleBase; - hres = dbgExt->symbols->GetModuleByModuleName( moduleName.c_str(), 0, NULL, &moduleBase ); - if ( FAILED( hres ) ) - return boost::python::object(); + ULONG64 moduleBase; + hres = dbgExt->symbols->GetModuleByModuleName( moduleName.c_str(), 0, NULL, &moduleBase ); + if ( FAILED( hres ) ) + throw DbgException( "IDebugSymbol::GetModuleByModuleName failed" ); - DEBUG_MODULE_PARAMETERS moduleParam = { 0 }; - hres = dbgExt->symbols->GetModuleParameters( 1, &moduleBase, 0, &moduleParam ); - if ( FAILED( hres ) ) - throw DbgException( "IDebugSymbol::GetModuleParameters failed" ); - - - return boost::python::object( dbgModuleClass( moduleName, moduleBase, moduleParam.Size ) ); - - } - catch( std::exception &e ) - { - dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd error: %s\n", e.what() ); - } - catch(...) - { - dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd unexpected error\n" ); - } - - return boost::python::object(); + DEBUG_MODULE_PARAMETERS moduleParam = { 0 }; + hres = dbgExt->symbols->GetModuleParameters( 1, &moduleBase, 0, &moduleParam ); + if ( FAILED( hres ) ) + throw DbgException( "IDebugSymbol::GetModuleParameters failed" ); + + + return boost::python::object( dbgModuleClass( moduleName, moduleBase, moduleParam.Size ) ); + } ///////////////////////////////////////////////////////////////////////////////// @@ -102,26 +90,13 @@ void queryModuleParams( boost::python::object findModule( ULONG64 addr ) { - try { - ULONG64 moduleBase; - ULONG moduleSize; - std::string moduleName; - queryModuleParams(addr, moduleName, moduleBase, moduleSize); - return - boost::python::object( - dbgModuleClass( moduleName, moduleBase, moduleSize ) - ); - } - catch( std::exception &e ) - { - dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd error: %s\n", e.what() ); - } - catch(...) - { - dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd unexpected error\n" ); - } - - return boost::python::object(); + ULONG64 moduleBase; + ULONG moduleSize; + std::string moduleName; + + queryModuleParams(addr, moduleName, moduleBase, moduleSize); + + return boost::python::object( dbgModuleClass( moduleName, moduleBase, moduleSize ) ); } ///////////////////////////////////////////////////////////////////////////////// @@ -186,55 +161,44 @@ dbgModuleClass::dbgModuleClass( const std::string &name, ULONG64 base, ULONG siz void dbgModuleClass::reloadSymbols() { - HRESULT hres; - - try { - static const char *szReloadParam = "/f "; //"/f /s "; - std::string reloadParam = szReloadParam; - reloadParam += m_name; + HRESULT hres; + static const char *szReloadParam = "/f "; //"/f /s "; + std::string reloadParam = szReloadParam; + reloadParam += m_name; + + { + // try reload module by entered name, "silent mode" + OutputReader outputReader( dbgExt->client ); + hres = dbgExt->symbols->Reload( reloadParam.c_str() ); + } + if ( FAILED( hres ) ) + { + // failed => try reload symbols by image file name + char szImageName[MAX_PATH/2]; + HRESULT hres2 = dbgExt->symbols2->GetModuleNameString( + DEBUG_MODNAME_IMAGE, + DEBUG_ANY_ID, + m_base, + szImageName, + _countof(szImageName), + NULL); + if (SUCCEEDED(hres2)) { - // try reload module by entered name, "silent mode" - OutputReader outputReader( dbgExt->client ); + PCSTR szImageFileName = strrchr(szImageName, '\\'); + if (!szImageFileName) + szImageFileName = szImageName; + else + ++szImageFileName; + + reloadParam = szReloadParam; + reloadParam += szImageFileName; hres = dbgExt->symbols->Reload( reloadParam.c_str() ); } - if ( FAILED( hres ) ) - { - // failed => try reload symbols by image file name - char szImageName[MAX_PATH/2]; - HRESULT hres2 = dbgExt->symbols2->GetModuleNameString( - DEBUG_MODNAME_IMAGE, - DEBUG_ANY_ID, - m_base, - szImageName, - _countof(szImageName), - NULL); - if (SUCCEEDED(hres2)) - { - PCSTR szImageFileName = strrchr(szImageName, '\\'); - if (!szImageFileName) - szImageFileName = szImageName; - else - ++szImageFileName; - - reloadParam = szReloadParam; - reloadParam += szImageFileName; - hres = dbgExt->symbols->Reload( reloadParam.c_str() ); - } - } - - if ( FAILED( hres ) ) - throw DbgException( "IDebugSymbol::Reload failed" ); } - catch( std::exception &e ) - { - dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd error: %s\n", e.what() ); - } - catch(...) - { - dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd unexpected error\n" ); - } - + + if ( FAILED( hres ) ) + throw DbgException( "IDebugSymbol::Reload failed" ); } ///////////////////////////////////////////////////////////////////////////////// @@ -247,8 +211,14 @@ dbgModuleClass::getOffset( const std::string &symName ) { return offset->second; } + ModuleInfo moduleInfo(m_debugInfo); - return ::getSyntheticSymbol(moduleInfo, symName); + ULONG64 syntheticOffset = getSyntheticSymbol(moduleInfo, symName); + + if ( syntheticOffset == 0 ) + throw DbgException( "failed to find offset for symbol" ); + + return syntheticOffset; } ///////////////////////////////////////////////////////////////////////////////// @@ -294,106 +264,82 @@ void dbgModuleClass::getImagePath() { HRESULT hres; - - try { + + ULONG pathSize = 0; + hres = dbgExt->symbols3->GetSymbolPathWide( NULL, 0, &pathSize ); + if ( FAILED( hres ) ) + throw DbgException( "IDebugSymbol3::GetImagePathWide failed" ); + + std::vector pathBuffer(pathSize); - ULONG pathSize = 0; - hres = dbgExt->symbols3->GetSymbolPathWide( NULL, 0, &pathSize ); - if ( FAILED( hres ) ) - throw DbgException( "IDebugSymbol3::GetImagePathWide failed" ); + hres = dbgExt->symbols3->GetSymbolPathWide( &pathBuffer[0], pathSize, NULL ); + if ( FAILED( hres ) ) + throw DbgException( "IDebugSymbol3::GetImagePathWide failed" ); + + std::wstring symPath( &pathBuffer[0], pathSize ); + + std::wstring altName = m_debugInfo.CVData; + altName = altName.substr( 0, altName.find_last_of(L".") ); + + std::wstring imageName = m_debugInfo.LoadedImageName; + altName += imageName.substr( imageName.find_last_of(L".") ); + + for ( size_t offset = 0; offset < symPath.length(); ) + { + size_t newOffset = symPath.find( L";", offset ); + std::wstring subPath = symPath.substr( offset, newOffset - offset ); + + std::wstringstream sstr; + + sstr << subPath << L"\\" << m_debugInfo.LoadedImageName << L"\\" << std::hex << + m_debugInfo.TimeDateStamp << m_debugInfo.ImageSize << L"\\" << + m_debugInfo.LoadedImageName; - std::vector pathBuffer(pathSize); - - hres = dbgExt->symbols3->GetSymbolPathWide( &pathBuffer[0], pathSize, NULL ); - if ( FAILED( hres ) ) - throw DbgException( "IDebugSymbol3::GetImagePathWide failed" ); - - std::wstring symPath( &pathBuffer[0], pathSize ); - - std::wstring altName = m_debugInfo.CVData; - altName = altName.substr( 0, altName.find_last_of(L".") ); - - std::wstring imageName = m_debugInfo.LoadedImageName; - altName += imageName.substr( imageName.find_last_of(L".") ); - - for ( size_t offset = 0; offset < symPath.length(); ) + if( (_waccess( sstr.str().c_str(), 0 )) != -1 ) { - size_t newOffset = symPath.find( L";", offset ); - std::wstring subPath = symPath.substr( offset, newOffset - offset ); + m_imageFullName = sstr.str(); + break; + } + + + std::wstringstream altstr; + + altstr << subPath << L"\\" << altName << L"\\" << std::hex << + m_debugInfo.TimeDateStamp << m_debugInfo.ImageSize << L"\\" << + altName; - std::wstringstream sstr; - - sstr << subPath << L"\\" << m_debugInfo.LoadedImageName << L"\\" << std::hex << - m_debugInfo.TimeDateStamp << m_debugInfo.ImageSize << L"\\" << - m_debugInfo.LoadedImageName; - - if( (_waccess( sstr.str().c_str(), 0 )) != -1 ) - { - m_imageFullName = sstr.str(); - break; - } - - - std::wstringstream altstr; - - altstr << subPath << L"\\" << altName << L"\\" << std::hex << - m_debugInfo.TimeDateStamp << m_debugInfo.ImageSize << L"\\" << - altName; - - if( (_waccess( altstr.str().c_str(), 0 )) != -1 ) - { - m_imageFullName = altstr.str(); - break; - } - - if ( newOffset == std::wstring::npos ) - break; - - offset = newOffset + 1; - } - - } - catch( std::exception &e ) - { - dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd error: %s\n", e.what() ); - } - catch(...) - { - dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd unexpected error\n" ); - } + if( (_waccess( altstr.str().c_str(), 0 )) != -1 ) + { + m_imageFullName = altstr.str(); + break; + } + + if ( newOffset == std::wstring::npos ) + break; + + offset = newOffset + 1; + } } std::string dbgModuleClass::print() const { - try - { - const char * format_string(dbgExt->control->IsPointer64Bit() == S_OK ? - "%1$016x %2$016x %3$20s %4$20s" : "%1$08x %2$08x %3$20s %4$20s"); - boost::format fmt(format_string); - std::vector v(MAX_PATH); - ::WideCharToMultiByte( - CP_ACP, - 0, - m_imageFullName.c_str(), - -1, - &v[0], - (ULONG)v.size(), - 0, - 0); - std::string fullname(&v[0]); - fmt % m_base % (m_end - m_base) % m_name % fullname; - return fmt.str(); - } - catch (std::exception & e) - { - dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd error: %s\n", e.what() ); - } - catch (...) - { - dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd unexpected error\n" ); - } - return ""; + const char * format_string(dbgExt->control->IsPointer64Bit() == S_OK ? + "%1$016x %2$016x %3$20s %4$20s" : "%1$08x %2$08x %3$20s %4$20s"); + boost::format fmt(format_string); + std::vector v(MAX_PATH); + ::WideCharToMultiByte( + CP_ACP, + 0, + m_imageFullName.c_str(), + -1, + &v[0], + (ULONG)v.size(), + 0, + 0); + std::string fullname(&v[0]); + fmt % m_base % (m_end - m_base) % m_name % fullname; + return fmt.str(); } ///////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/pykd/dbgsym.cpp b/pykd/dbgsym.cpp index 3b33fee..b205f97 100644 --- a/pykd/dbgsym.cpp +++ b/pykd/dbgsym.cpp @@ -62,28 +62,17 @@ ULONG64 findAddressForSymbol( const std::string &moduleName, const std::string &symbolName ) { HRESULT hres; - - try { - std::string ModuleSymName = moduleName; - ModuleSymName += "!"; - ModuleSymName += symbolName; + std::string ModuleSymName = moduleName; + ModuleSymName += "!"; + ModuleSymName += symbolName; - ULONG64 offset = 0ULL; - hres = dbgExt->symbols->GetOffsetByName( ModuleSymName.c_str(), &offset ); - if ( SUCCEEDED( hres ) ) - return offset; - } - catch( std::exception &e ) - { - dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd error: %s\n", e.what() ); - } - catch(...) - { - dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd unexpected error\n" ); - } + ULONG64 offset = 0ULL; + hres = dbgExt->symbols->GetOffsetByName( ModuleSymName.c_str(), &offset ); + if ( SUCCEEDED( hres ) ) + return offset; - return 0; + throw DbgException( "failed to find offset for symbol" ); } ///////////////////////////////////////////////////////////////////////////////// \ No newline at end of file