Skip to content

Commit

Permalink
[debugger][mono][icordbg] Implement minimal version of dbgshim to sta…
Browse files Browse the repository at this point in the history
…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
thaystg and lambdageek committed Apr 13, 2021
1 parent 03ea052 commit 82e8d0e
Show file tree
Hide file tree
Showing 53 changed files with 1,539 additions and 199 deletions.
3 changes: 2 additions & 1 deletion src/mono/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -707,7 +707,8 @@ endif()

add_subdirectory(mono)
if (ENABLE_MSCORDBI AND NOT TARGET_ARCH STREQUAL "arm64" AND NOT CMAKE_CROSSCOMPILING AND NOT TARGET_IOS AND NOT TARGET_ANDROID AND NOT TARGET_BROWSER AND NOT HOST_MACCATALYST)
add_subdirectory(dbi)
add_subdirectory(dlls/mscordbi)
add_subdirectory(dlls/dbgshim)
endif()

configure_file(cmake/config.h.in config.h)
Expand Down
90 changes: 90 additions & 0 deletions src/mono/dlls/dbgshim/CMakeLists.txt
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)
284 changes: 284 additions & 0 deletions src/mono/dlls/dbgshim/dbgshim.cpp
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;
}
Loading

0 comments on commit 82e8d0e

Please sign in to comment.