Allow mono debugging and jit flags (#16)

This commit is contained in:
Victor 2021-11-16 13:58:01 -08:00 коммит произвёл GitHub
Родитель c8ca462bdb
Коммит 699c6d640e
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
5 изменённых файлов: 56 добавлений и 2 удалений

12
.vscode/launch.json поставляемый Normal file
Просмотреть файл

@ -0,0 +1,12 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Attach",
"type": "mono",
"request": "attach",
"address": "localhost",
"port": 5831
}
]
}

Просмотреть файл

@ -1,4 +1,4 @@
from typing import Dict, Optional
from typing import Dict, Optional, Sequence
from .wrappers import Runtime
from .util.find import find_libmono, find_dotnet_root
@ -12,6 +12,8 @@ def get_mono(
global_config_file: Optional[str] = None,
libmono: Optional[str] = None,
sgen: bool = True,
debug: bool = False,
jit_options: Optional[Sequence[str]] = None,
) -> Runtime:
from .mono import Mono
@ -20,6 +22,8 @@ def get_mono(
impl = Mono(
domain=domain,
debug=debug,
jit_options=jit_options,
config_file=config_file,
global_config_file=global_config_file,
libmono=libmono,

Просмотреть файл

@ -11,8 +11,19 @@ typedef struct _MonoMethodDesc MonoMethodDesc;
typedef struct _MonoMethod MonoMethod;
typedef struct _MonoObject MonoObject;
typedef enum {
MONO_DEBUG_FORMAT_NONE,
MONO_DEBUG_FORMAT_MONO,
/* Deprecated, the mdb debugger is not longer supported. */
MONO_DEBUG_FORMAT_DEBUGGER
} MonoDebugFormat;
MonoDomain* mono_jit_init(const char *root_domain_name);
void mono_jit_cleanup(MonoDomain *domain);
void mono_jit_parse_options(int argc, char * argv[]);
void mono_debug_init (MonoDebugFormat format);
MonoAssembly* mono_domain_assembly_open(MonoDomain *domain, const char *name);
MonoImage* mono_assembly_get_image(MonoAssembly *assembly);

Просмотреть файл

@ -1,5 +1,5 @@
import atexit
from typing import Optional
from typing import Optional, Sequence
from .ffi import load_mono, ffi
@ -17,6 +17,8 @@ class Mono:
libmono,
*,
domain=None,
debug=False,
jit_options: Optional[Sequence[str]] = None,
config_file: Optional[str] = None,
global_config_file: Optional[str] = None,
):
@ -24,6 +26,8 @@ class Mono:
initialize(
config_file=config_file,
debug=debug,
jit_options=jit_options,
global_config_file=global_config_file,
libmono=libmono,
)
@ -95,6 +99,8 @@ class MonoMethod:
def initialize(
libmono: str,
debug: bool = False,
jit_options: Optional[Sequence[str]] = None,
config_file: Optional[str] = None,
global_config_file: Optional[str] = None,
) -> None:
@ -113,6 +119,13 @@ def initialize(
config_encoded = config_file.encode("utf8")
if jit_options:
options = [ffi.new("char[]", o.encode("utf8")) for o in jit_options]
_MONO.mono_jit_parse_options(len(options), options)
if debug:
_MONO.mono_debug_init(_MONO.MONO_DEBUG_FORMAT_MONO)
_ROOT_DOMAIN = _MONO.mono_jit_init(b"clr_loader")
_MONO.mono_domain_set_config(_ROOT_DOMAIN, b".", config_encoded)
_check_result(_ROOT_DOMAIN, "Failed to initialize Mono")

Просмотреть файл

@ -32,6 +32,20 @@ def test_mono(example_netstandard):
run_tests(asm)
def test_mono_debug(example_netstandard):
from clr_loader import get_mono
mono = get_mono(
debug=True,
jit_options=[
"--debugger-agent=address=0.0.0.0:5831,transport=dt_socket,server=y"
],
)
asm = mono.get_assembly(os.path.join(example_netstandard, "example.dll"))
run_tests(asm)
def test_coreclr(example_netcore):
from clr_loader import get_coreclr