Browse Source

fixed SD-1725 - BadImageFormatException when profiling .NET 4 WinForms application

pull/14/head
Siegfried Pammer 15 years ago
parent
commit
c51c4a525d
  1. 42
      src/AddIns/Analysis/Profiler/Hook/Profiler.Rewriting.cpp
  2. 2
      src/AddIns/Analysis/Profiler/Hook/Profiler.cpp
  3. 15
      src/AddIns/Analysis/Profiler/Hook/constants.cpp
  4. 6
      src/AddIns/Analysis/Profiler/Hook/global.h

42
src/AddIns/Analysis/Profiler/Hook/Profiler.Rewriting.cpp

@ -194,10 +194,6 @@ int CProfiler::SetInjectionCode(IMetaDataImport *metaData, byte *buffer, int *si
buffer[(*size)++] = 0x14; //ldnull buffer[(*size)++] = 0x14; //ldnull
break; break;
case 2: // Windows Forms case 2: // Windows Forms
buffer[(*size)++] = 0x14; //ldnull
buffer[(*size)++] = 0x14; //ldnull
break;
/*
hr = metaData->FindTypeDefByName(L"System.Windows.Forms.Control", nullptr, &controlType); hr = metaData->FindTypeDefByName(L"System.Windows.Forms.Control", nullptr, &controlType);
if (!SUCCEEDED(hr) || controlType == 0) { if (!SUCCEEDED(hr) || controlType == 0) {
@ -234,7 +230,7 @@ int CProfiler::SetInjectionCode(IMetaDataImport *metaData, byte *buffer, int *si
buffer[(*size)++] = 0x6F; //callvirt buffer[(*size)++] = 0x6F; //callvirt
*(mdMethodDef*)(&buffer[*size]) = getTextToken; *(mdMethodDef*)(&buffer[*size]) = getTextToken;
*size += sizeof(getTextToken); *size += sizeof(getTextToken);
break;*/ break;
case 3: // WPF case 3: // WPF
buffer[(*size)++] = 0x14; //ldnull buffer[(*size)++] = 0x14; //ldnull
buffer[(*size)++] = 0x14; //ldnull buffer[(*size)++] = 0x14; //ldnull
@ -318,6 +314,42 @@ STDMETHODIMP CProfiler::ModuleLoadFinished(ModuleID moduleID, HRESULT /*hrStatus
IMetaDataEmit *pIMetaDataEmit = nullptr; IMetaDataEmit *pIMetaDataEmit = nullptr;
IMetaDataAssemblyImport *asmMetaData = nullptr; IMetaDataAssemblyImport *asmMetaData = nullptr;
WCHAR moduleName[NAME_BUFFER_SIZE];
WCHAR assemblyName[NAME_BUFFER_SIZE];
AssemblyID assemblyID;
ULONG actualLen = 0;
hr = pICorProfilerInfo->GetModuleInfo(moduleID, nullptr, NAME_BUFFER_SIZE, &actualLen, moduleName, &assemblyID);
if (!SUCCEEDED(hr))
goto CLEANUP;
hr = pICorProfilerInfo->GetAssemblyInfo(assemblyID, NAME_BUFFER_SIZE, &actualLen, assemblyName, nullptr, nullptr);
if (!SUCCEEDED(hr))
goto CLEANUP;
DebugWriteLine(L"\n----------------- Module Load finished -----------------\n");
DebugWriteLine(L"Module Name: '%s'\n", moduleName);
DebugWriteLine(L"Assembly Name: '%s'\n", assemblyName);
DebugWriteLine(L"--------------------------------------------------------\n");
bool found = false;
for (int i = 0; i < ASSEMBLY_INJECTION_NAME_LIST_LENGTH; i++) {
if (wcscmp(assemblyInjectionNameList[i], assemblyName) == 0) {
found = true;
break;
}
}
if (!found) {
DebugWriteLine(L"Assembly Name '%s' not found in list!\n", assemblyName);
goto CLEANUP;
}
hr = pICorProfilerInfo->GetModuleMetaData(moduleID, ofRead | ofWrite, IID_IMetaDataEmit, (LPUNKNOWN *) &pIMetaDataEmit); hr = pICorProfilerInfo->GetModuleMetaData(moduleID, ofRead | ofWrite, IID_IMetaDataEmit, (LPUNKNOWN *) &pIMetaDataEmit);
if (!SUCCEEDED(hr) || pIMetaDataEmit == nullptr) if (!SUCCEEDED(hr) || pIMetaDataEmit == nullptr)

2
src/AddIns/Analysis/Profiler/Hook/Profiler.cpp

@ -378,7 +378,7 @@ HRESULT CProfiler::SetEventMask() {
COR_PRF_MONITOR_FUNCTION_UNLOADS | COR_PRF_MONITOR_CLR_EXCEPTIONS | COR_PRF_MONITOR_FUNCTION_UNLOADS | COR_PRF_MONITOR_CLR_EXCEPTIONS |
COR_PRF_MONITOR_EXCEPTIONS; COR_PRF_MONITOR_EXCEPTIONS;
if (sharedMemoryHeader->trackEvents) if (sharedMemoryHeader->trackEvents)
eventMask = eventMask | COR_PRF_MONITOR_MODULE_LOADS/* | COR_PRF_MONITOR_JIT_COMPILATION*/; eventMask = eventMask | COR_PRF_MONITOR_MODULE_LOADS | COR_PRF_MONITOR_JIT_COMPILATION;
return pICorProfilerInfo->SetEventMask(eventMask); return pICorProfilerInfo->SetEventMask(eventMask);
} }

15
src/AddIns/Analysis/Profiler/Hook/constants.cpp

@ -3,17 +3,22 @@
#include "global.h" #include "global.h"
WCHAR *assemblyInjectionNameList[ASSEMBLY_INJECTION_NAME_LIST_LENGTH] = {
L"mscorlib",
L"System.Windows.Forms",
L"PresentationCore"
};
WCHAR *consoleGroupList[CONSOLE_GROUP_LENGTH] = { WCHAR *consoleGroupList[CONSOLE_GROUP_LENGTH] = {
L"System.Console.Write", L"System.Console.Write",
L"System.Console.WriteLine" L"System.Console.WriteLine"
}; };
WCHAR *winFormsGroupList[WINFORMS_GROUP_LENGTH] = { WCHAR *winFormsGroupList[WINFORMS_GROUP_LENGTH] = {
L"-------------------------------------------------", L"System.Windows.Forms.Control.OnClick",
// L"System.Windows.Forms.Control.OnClick", L"System.Windows.Forms.Control.OnDoubleClick",
// L"System.Windows.Forms.Control.OnDoubleClick", L"System.Windows.Forms.Control.OnMouseWheel",
// L"System.Windows.Forms.Control.OnMouseWheel", L"System.Windows.Forms.Control.OnKeyDown"
// L"System.Windows.Forms.Control.OnKeyDown"
}; };
WCHAR *wpfGroupList[WPF_GROUP_LENGTH] = { WCHAR *wpfGroupList[WPF_GROUP_LENGTH] = {

6
src/AddIns/Analysis/Profiler/Hook/global.h

@ -10,8 +10,11 @@
#include "LightweightStack.h" #include "LightweightStack.h"
#include "LightweightList.h" #include "LightweightList.h"
#define NAME_BUFFER_SIZE 1024
#define ASSEMBLY_INJECTION_NAME_LIST_LENGTH 3
#define CONSOLE_GROUP_LENGTH 2 #define CONSOLE_GROUP_LENGTH 2
#define WINFORMS_GROUP_LENGTH 1 #define WINFORMS_GROUP_LENGTH 4
#define WPF_GROUP_LENGTH 1 #define WPF_GROUP_LENGTH 1
extern fastAllocator stackAllocator; extern fastAllocator stackAllocator;
@ -21,6 +24,7 @@ extern HANDLE listMutex;
extern LightweightList *allThreadLocalDatas; extern LightweightList *allThreadLocalDatas;
extern DWORD tls_index; extern DWORD tls_index;
extern WCHAR *assemblyInjectionNameList[ASSEMBLY_INJECTION_NAME_LIST_LENGTH];
extern WCHAR *consoleGroupList[CONSOLE_GROUP_LENGTH]; extern WCHAR *consoleGroupList[CONSOLE_GROUP_LENGTH];
extern WCHAR *winFormsGroupList[WINFORMS_GROUP_LENGTH]; extern WCHAR *winFormsGroupList[WINFORMS_GROUP_LENGTH];
extern WCHAR *wpfGroupList[WPF_GROUP_LENGTH]; extern WCHAR *wpfGroupList[WPF_GROUP_LENGTH];

Loading…
Cancel
Save