-
Notifications
You must be signed in to change notification settings - Fork 4.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[debugger][mono][icordbg] Implement minimal version of dbgshim to sta…
…rt an application on desktop (#50505) * Running debugger tests on windows using mono runtime * Coreclr Debugger Tests are running on windows * Removing wrong comments * Update src/mono/dlls/dbgshim/dbgshim.cpp Co-authored-by: Aleksey Kliger (λgeek) <akliger@gmail.com> * Changing what was suggested by @lambdageek * Fix running tests on Mac * Fix windows compilation removing unused messages * Fix merge * Fix compilation on other platforms then amd64 * Fix copy files when does not generate dbgshim and mscordbi * Ignore when mscodbig and dbgshim is not found * Fix copy files when they don't exist * Update src/mono/mono/mini/debugger-protocol.c Co-authored-by: Aleksey Kliger (λgeek) <akliger@gmail.com> Co-authored-by: Aleksey Kliger (λgeek) <akliger@gmail.com>
- Loading branch information
1 parent
03ea052
commit 82e8d0e
Showing
53 changed files
with
1,539 additions
and
199 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
project(dbgshim) | ||
|
||
set(CMAKE_INCLUDE_CURRENT_DIR ON) | ||
|
||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) | ||
set(CMAKE_CXX_STANDARD 11) | ||
set(CMAKE_CXX_STANDARD_REQUIRED ON) | ||
|
||
set(CLR_DIR ${PROJECT_SOURCE_DIR}/../../coreclr) | ||
set(VM_DIR ${PROJECT_SOURCE_DIR}/../../coreclr/vm) | ||
set(CMAKE_OSX_ARCHITECTURES ${CMAKE_SYSTEM_PROCESSOR}) | ||
set(CMAKE_EXE_LINKER_FLAGS_CHECKED "") | ||
set(CMAKE_SHARED_LINKER_FLAGS_CHECKED "") | ||
set(CLR_CMAKE_HOST_ARCH ${CMAKE_GENERATOR_PLATFORM}) | ||
set(FEATURE_EVENT_TRACE 0) | ||
|
||
if(HOST_WIN32) | ||
if(HOST_X86) | ||
set(CLR_CMAKE_HOST_ARCH x86) | ||
elseif(HOST_ARM64) | ||
set(CLR_CMAKE_HOST_ARCH arm64) | ||
elseif(HOST_ARM) | ||
set(CLR_CMAKE_HOST_ARCH arm) | ||
elseif(HOST_AMD64) | ||
set(CLR_CMAKE_HOST_ARCH x64) | ||
endif() | ||
endif() | ||
|
||
include(${PROJECT_SOURCE_DIR}/../../../../eng/native/configuretools.cmake) | ||
include(${PROJECT_SOURCE_DIR}/../../../../eng/native/configurepaths.cmake) | ||
include(${PROJECT_SOURCE_DIR}/../../../../eng/native/configureplatform.cmake) | ||
include(${PROJECT_SOURCE_DIR}/../../../../eng/native/configurecompiler.cmake) | ||
|
||
|
||
add_definitions(-D_WIN32_WINNT=0x0602) | ||
|
||
include_directories( | ||
${CMAKE_CURRENT_SOURCE_DIR}/../../.. | ||
${PROJECT_SOURCE_DIR}/../../ | ||
${PROJECT_SOURCE_DIR}/../mscordbi | ||
${PROJECT_SOURCE_DIR}/../mscordbi/socket-dbi | ||
${PROJECT_SOURCE_DIR}/../../../coreclr/md/enc | ||
${PROJECT_SOURCE_DIR}/../../../coreclr/inc | ||
${PROJECT_SOURCE_DIR}/../../../coreclr/pal/inc | ||
${PROJECT_SOURCE_DIR}/../../../coreclr/md/inc | ||
${PROJECT_SOURCE_DIR}/../../../coreclr/md/compiler) | ||
|
||
include_directories("../../../coreclr/pal/prebuilt/inc") | ||
include_directories("../../../coreclr/nativeresources") | ||
|
||
if (CLR_CMAKE_HOST_UNIX) | ||
include_directories("${PROJECT_SOURCE_DIR}/../../../coreclr/pal/inc") | ||
include_directories("${PROJECT_SOURCE_DIR}/../../../coreclr/pal/inc/rt") | ||
include_directories("${PROJECT_SOURCE_DIR}/../../../coreclr/pal/src/safecrt") | ||
|
||
append("-Wno-missing-prototypes -Wno-pointer-arith -Wno-macro-redefined" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) | ||
|
||
include_directories("../../../coreclr/pal/inc/rt/cpp") | ||
endif (CLR_CMAKE_HOST_UNIX) | ||
|
||
set(DBGSHIM_SOURCES | ||
dbgshim.cpp | ||
) | ||
|
||
add_library(dbgshim SHARED ${DBGSHIM_SOURCES}) | ||
|
||
if(HOST_DARWIN) | ||
set(OS_LIBS "-framework CoreFoundation" "-framework Foundation") | ||
elseif(HOST_LINUX) | ||
set(OS_LIBS pthread m dl) | ||
elseif(HOST_WIN32) | ||
set(OS_LIBS bcrypt.lib Mswsock.lib ws2_32.lib psapi.lib version.lib advapi32.lib winmm.lib kernel32.lib) | ||
endif() | ||
|
||
|
||
set(DBGSHIM_LIBRARIES | ||
${OS_LIBS} | ||
utilcodestaticnohost | ||
) | ||
|
||
if(CLR_CMAKE_HOST_UNIX) | ||
list(APPEND DBGSHIM_LIBRARIES | ||
coreclrpal | ||
palrt | ||
nativeresourcestring | ||
) | ||
endif() | ||
|
||
target_link_libraries(dbgshim ${DBGSHIM_LIBRARIES}) | ||
install(TARGETS dbgshim DESTINATION lib) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,284 @@ | ||
// Licensed to the .NET Foundation under one or more agreements. | ||
// The .NET Foundation licenses this file to you under the MIT license. | ||
//***************************************************************************** | ||
// DbgShim.cpp | ||
// | ||
// dbgshim is responsible to start the debuggee process with debug parameters and to | ||
// load the correct mscordbi that will connect with mono runtime. | ||
//***************************************************************************** | ||
|
||
#include <utilcode.h> | ||
|
||
#include "dbgshim.h" | ||
|
||
#include "palclr.h" | ||
#if defined(TARGET_WINDOWS) | ||
#include <libloaderapi.h> | ||
#else | ||
#include <dlfcn.h> | ||
#define putenv _putenv | ||
#endif | ||
|
||
#ifndef MAX_LONGPATH | ||
#define MAX_LONGPATH 1024 | ||
#endif | ||
|
||
#ifdef HOST_UNIX | ||
#define INITIALIZE_SHIM { if (PAL_InitializeDLL() != 0) return E_FAIL; } | ||
#else | ||
#define INITIALIZE_SHIM | ||
#endif | ||
|
||
// Contract for public APIs. These must be NOTHROW. | ||
#define PUBLIC_CONTRACT \ | ||
INITIALIZE_SHIM \ | ||
CONTRACTL \ | ||
{ \ | ||
NOTHROW; \ | ||
} \ | ||
CONTRACTL_END; | ||
|
||
// Functions that we'll look for in the loaded Mscordbi module. | ||
typedef HRESULT (STDAPICALLTYPE *FPCoreCLRCreateCordbObject)( | ||
int iDebuggerVersion, | ||
DWORD pid, | ||
HMODULE hmodTargetCLR, | ||
IUnknown **ppCordb); | ||
|
||
//----------------------------------------------------------------------------- | ||
// Public API. | ||
// | ||
// CreateProcessForLaunch - a stripped down version of the Windows CreateProcess | ||
// that can be supported cross-platform. | ||
// | ||
//----------------------------------------------------------------------------- | ||
MONO_API HRESULT | ||
CreateProcessForLaunch( | ||
__in LPWSTR lpCommandLine, | ||
__in BOOL bSuspendProcess, | ||
__in LPVOID lpEnvironment, | ||
__in LPCWSTR lpCurrentDirectory, | ||
__out PDWORD pProcessId, | ||
__out HANDLE *pResumeHandle) | ||
{ | ||
PUBLIC_CONTRACT; | ||
PROCESS_INFORMATION processInfo; | ||
STARTUPINFOW startupInfo; | ||
DWORD dwCreationFlags = 0; | ||
|
||
ZeroMemory(&processInfo, sizeof(processInfo)); | ||
ZeroMemory(&startupInfo, sizeof(startupInfo)); | ||
|
||
startupInfo.cb = sizeof(startupInfo); | ||
|
||
putenv("MONO_ENV_OPTIONS='--debugger-agent=transport=dt_socket,address=127.0.0.1:pid_based,server=n,suspend=y,loglevel=10,timeout=100000'"); | ||
|
||
BOOL result = CreateProcessW( | ||
NULL, | ||
lpCommandLine, | ||
NULL, | ||
NULL, | ||
FALSE, | ||
dwCreationFlags, | ||
NULL, | ||
lpCurrentDirectory, | ||
&startupInfo, | ||
&processInfo); | ||
|
||
if (!result) { | ||
*pProcessId = 0; | ||
*pResumeHandle = NULL; | ||
return HRESULT_FROM_WIN32(GetLastError()); | ||
} | ||
|
||
if (processInfo.hProcess != NULL) | ||
{ | ||
CloseHandle(processInfo.hProcess); | ||
} | ||
|
||
*pProcessId = processInfo.dwProcessId; | ||
*pResumeHandle = processInfo.hThread; | ||
|
||
return S_OK; | ||
} | ||
|
||
MONO_API HRESULT | ||
ResumeProcess( | ||
__in HANDLE hResumeHandle) | ||
{ | ||
return S_OK; | ||
} | ||
|
||
MONO_API HRESULT | ||
CloseResumeHandle( | ||
__in HANDLE hResumeHandle) | ||
{ | ||
return S_OK; | ||
} | ||
|
||
|
||
HRESULT CreateCoreDbg(HMODULE hDBIModule, DWORD processId, int iDebuggerVersion, IUnknown **ppCordb) | ||
{ | ||
HRESULT hr = S_OK; | ||
|
||
#if defined(TARGET_WINDOWS) | ||
FPCoreCLRCreateCordbObject fpCreate = | ||
(FPCoreCLRCreateCordbObject)GetProcAddress(hDBIModule, "CoreCLRCreateCordbObject"); | ||
#else | ||
FPCoreCLRCreateCordbObject fpCreate = (FPCoreCLRCreateCordbObject)dlsym (hDBIModule, "CoreCLRCreateCordbObject"); | ||
#endif | ||
|
||
if (fpCreate == NULL) | ||
{ | ||
return CORDBG_E_INCOMPATIBLE_PROTOCOL; | ||
} | ||
|
||
return fpCreate(iDebuggerVersion, processId, NULL, ppCordb); | ||
|
||
return hr; | ||
} | ||
|
||
char* convertC(const WCHAR * wString) | ||
{ | ||
int size; | ||
char * MultiBuffer = NULL; | ||
|
||
size = WideCharToMultiByte(CP_ACP,0,wString,-1,MultiBuffer,0,NULL,NULL); | ||
MultiBuffer = (char*) malloc(size); | ||
if (MultiBuffer == NULL) | ||
{ | ||
return NULL; | ||
} | ||
WideCharToMultiByte(CP_ACP,0,wString,-1,MultiBuffer,size,NULL,NULL); | ||
return MultiBuffer; | ||
} | ||
|
||
static IUnknown* pCordb = NULL; | ||
|
||
MONO_API HRESULT | ||
RegisterForRuntimeStartup( | ||
__in DWORD dwProcessId, | ||
__in PSTARTUP_CALLBACK pfnCallback, | ||
__in PVOID parameter, | ||
__out PVOID *ppUnregisterToken) | ||
{ | ||
if (pCordb != NULL) | ||
return S_OK; | ||
|
||
HRESULT hr = S_OK; | ||
HMODULE hMod = NULL; | ||
|
||
char* msCorDbiPath = getenv("MSCORDBI_PATH"); | ||
#ifdef TARGET_WINDOWS | ||
hMod = LoadLibraryA(msCorDbiPath); | ||
#else | ||
hMod = dlopen(msCorDbiPath, RTLD_LAZY); | ||
#endif | ||
if (hMod == NULL) | ||
{ | ||
hr = CORDBG_E_DEBUG_COMPONENT_MISSING; | ||
goto exit; | ||
} | ||
|
||
hr = CreateCoreDbg(hMod, dwProcessId, 0, &pCordb); | ||
|
||
exit: | ||
if (FAILED(hr)) | ||
{ | ||
_ASSERTE(pCordb == NULL); | ||
|
||
if (hMod != NULL) | ||
{ | ||
FreeLibrary(hMod); | ||
} | ||
|
||
// Invoke the callback on error | ||
pfnCallback(NULL, parameter, hr); | ||
return hr; | ||
} | ||
pfnCallback(pCordb, parameter, S_OK); | ||
return S_OK; | ||
} | ||
|
||
MONO_API HRESULT | ||
RegisterForRuntimeStartupEx( | ||
__in DWORD dwProcessId, | ||
__in LPCWSTR szApplicationGroupId, | ||
__in PSTARTUP_CALLBACK pfnCallback, | ||
__in PVOID parameter, | ||
__out PVOID *ppUnregisterToken) | ||
{ | ||
return S_OK; | ||
} | ||
|
||
MONO_API HRESULT | ||
UnregisterForRuntimeStartup( | ||
__in PVOID pUnregisterToken) | ||
{ | ||
return S_OK; | ||
} | ||
|
||
MONO_API HRESULT | ||
GetStartupNotificationEvent( | ||
__in DWORD debuggeePID, | ||
__out HANDLE* phStartupEvent) | ||
{ | ||
return S_OK; | ||
} | ||
|
||
MONO_API HRESULT | ||
EnumerateCLRs(DWORD debuggeePID, | ||
__out HANDLE** ppHandleArrayOut, | ||
__out LPWSTR** ppStringArrayOut, | ||
__out DWORD* pdwArrayLengthOut) | ||
{ | ||
return S_OK; | ||
} | ||
|
||
MONO_API HRESULT | ||
CloseCLREnumeration( | ||
__in HANDLE* pHandleArray, | ||
__in LPWSTR* pStringArray, | ||
__in DWORD dwArrayLength) | ||
{ | ||
return S_OK; | ||
} | ||
|
||
MONO_API HRESULT | ||
CreateVersionStringFromModule( | ||
__in DWORD pidDebuggee, | ||
__in LPCWSTR szModuleName, | ||
__out_ecount_part(cchBuffer, *pdwLength) LPWSTR pBuffer, | ||
__in DWORD cchBuffer, | ||
__out DWORD* pdwLength) | ||
{ | ||
return S_OK; | ||
} | ||
|
||
MONO_API HRESULT | ||
CreateDebuggingInterfaceFromVersionEx( | ||
__in int iDebuggerVersion, | ||
__in LPCWSTR szDebuggeeVersion, | ||
__out IUnknown ** ppCordb) | ||
{ | ||
return S_OK; | ||
} | ||
|
||
MONO_API | ||
HRESULT | ||
CreateDebuggingInterfaceFromVersion2( | ||
__in int iDebuggerVersion, | ||
__in LPCWSTR szDebuggeeVersion, | ||
__in LPCWSTR szApplicationGroupId, | ||
__out IUnknown ** ppCordb) | ||
{ | ||
return S_OK; | ||
} | ||
|
||
MONO_API HRESULT | ||
CreateDebuggingInterfaceFromVersion( | ||
__in LPCWSTR szDebuggeeVersion, | ||
__out IUnknown ** ppCordb) | ||
{ | ||
return S_OK; | ||
} |
Oops, something went wrong.