You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
4.2 KiB
139 lines
4.2 KiB
/****************************************************************** |
|
* |
|
* kdbgwin - Helper application for DrKonqi |
|
* |
|
* This file is part of the KDE project |
|
* |
|
* Copyright (C) 2010 Ilie Halip <lupuroshu@gmail.com> |
|
* |
|
* This library is free software; you can redistribute it and/or |
|
* modify it under the terms of the GNU Lesser General Public |
|
* License as published by the Free Software Foundation; either |
|
* version 2.1 of the License, or (at your option) version 3, or any |
|
* later version accepted by the membership of KDE e.V. (or its |
|
* successor approved by the membership of KDE e.V.), which shall |
|
* act as a proxy defined in Section 6 of version 3 of the license. |
|
* |
|
* This library is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
* Lesser General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU Lesser General Public |
|
* License along with this library. If not, see <http://www.gnu.org/licenses/> |
|
*****************************************************************/ |
|
|
|
#include "msvc_generator.h" |
|
|
|
MsvcGenerator::MsvcGenerator(const Process& process) |
|
: AbstractBTGenerator(process) |
|
{} |
|
|
|
bool MsvcGenerator::Init() |
|
{ |
|
return true; |
|
} |
|
|
|
void MsvcGenerator::UnInit() |
|
{ |
|
} |
|
|
|
QString MsvcGenerator::GetFunctionName() |
|
{ |
|
PSYMBOL_INFO symbol = |
|
(PSYMBOL_INFO) malloc(sizeof(SYMBOL_INFO) + MAX_SYMBOL_NAME); |
|
ZeroMemory(symbol, sizeof(symbol) + MAX_SYMBOL_NAME); |
|
symbol->SizeOfStruct = sizeof(SYMBOL_INFO); |
|
symbol->MaxNameLen = MAX_SYMBOL_NAME; |
|
|
|
DWORD64 dwDisplacement = 0; |
|
|
|
if (!SymFromAddr(m_process.GetHandle(), m_currentFrame.AddrPC.Offset, &dwDisplacement, symbol)) |
|
{ |
|
kError() << "SymFromAddr() failed: " << GetLastError(); |
|
return QString::fromLatin1(DEFAULT_FUNC); |
|
} |
|
|
|
char undecoratedName[MAX_PATH] = {0}; |
|
if (!UnDecorateSymbolName(symbol->Name, undecoratedName, MAX_PATH, UNDNAME_COMPLETE)) |
|
{ |
|
// if this fails, show the decorated name anyway, don't fail |
|
kError() << "UnDecorateSymbolName() failed: " << GetLastError(); |
|
return QString::fromLatin1(symbol->Name); |
|
} |
|
|
|
return QString::fromLatin1(undecoratedName); |
|
} |
|
|
|
QString MsvcGenerator::GetFile() |
|
{ |
|
IMAGEHLP_LINE64 line; |
|
ZeroMemory(&line, sizeof(line)); |
|
line.SizeOfStruct = sizeof(IMAGEHLP_LINE64); |
|
DWORD dwDisplacement = 0; |
|
|
|
if (!SymGetLineFromAddr64(m_process.GetHandle(), m_currentFrame.AddrPC.Offset, &dwDisplacement, &line)) |
|
{ |
|
kError() << "SymGetLineFromAddr64 failed: " << GetLastError(); |
|
return QString::fromLatin1(DEFAULT_FILE); |
|
} |
|
|
|
return QString(line.FileName); |
|
} |
|
|
|
int MsvcGenerator::GetLine() |
|
{ |
|
IMAGEHLP_LINE64 line; |
|
ZeroMemory(&line, sizeof(line)); |
|
line.SizeOfStruct = sizeof(IMAGEHLP_LINE64); |
|
DWORD dwDisplacement = 0; |
|
|
|
if (!SymGetLineFromAddr64(m_process.GetHandle(), m_currentFrame.AddrPC.Offset, &dwDisplacement, &line)) |
|
{ |
|
//kError() << "SymGetLineFromAddr64 failed: " << GetLastError(); |
|
return DEFAULT_LINE; |
|
} |
|
|
|
return (int) line.LineNumber; |
|
} |
|
|
|
void MsvcGenerator::LoadSymbol(const QString& module, DWORD64 dwBaseAddr) |
|
{ |
|
QString strOutput; |
|
|
|
IMAGEHLP_MODULE64 moduleInfo; |
|
ZeroMemory(&moduleInfo, sizeof(moduleInfo)); |
|
moduleInfo.SizeOfStruct = sizeof(moduleInfo); |
|
SymGetModuleInfo64(m_process.GetHandle(), dwBaseAddr, &moduleInfo); |
|
|
|
m_symbolsMap[module] = false; // default |
|
QString symbolType; |
|
switch (moduleInfo.SymType) |
|
{ |
|
case SymNone: |
|
symbolType = QString::fromLatin1("no symbols loaded"); |
|
break; |
|
case SymCoff: |
|
case SymCv: |
|
case SymPdb: |
|
case SymSym: |
|
case SymDia: |
|
symbolType = QString::fromLatin1("symbols loaded"); |
|
m_symbolsMap[module] = true; |
|
break; |
|
case SymExport: |
|
symbolType = QString::fromLatin1("export table only"); |
|
break; |
|
case SymDeferred: |
|
symbolType = QString::fromLatin1("deferred (not loaded currently)"); |
|
break; |
|
case SymVirtual: |
|
symbolType = QString::fromLatin1("virtual"); |
|
break; |
|
} |
|
|
|
strOutput = QString::fromLatin1("Loaded %1 (%2)") |
|
.arg(module).arg(symbolType); |
|
|
|
emit DebugLine(strOutput); |
|
}
|
|
|