这是可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行的命令 mono,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
mono - Mono 的 ECMA-CLI 本机代码生成器(即时和提前)
概要
单 [选项] 文件 [争论...]
单基因 [选项] 文件 [争论...]
商品描述
单 是 ECMA 公共语言基础结构的运行时实现。 这可以
用于运行 ECMA 和 .NET 应用程序。
运行时包含一个本机代码生成器,用于转换公共中间体
语言转换为本机代码。
代码生成器可以在两种模式下运行:即时编译 (JIT) 或提前编译
时间编译(AOT)。 由于代码可以动态加载,运行时环境和
JIT 始终存在,即使代码是提前编译的。
运行时加载指定的 文件 并可选择通过 参数 到它。 这 文件
是一个 ECMA 程序集。 它们通常具有 .exe 或 .dll 扩展名。
运行时为运行应用程序提供了许多配置选项,例如
开发和调试,以及测试和调试运行时本身。
这款 单 命令使用 Boehm 保守垃圾收集器,而 单基因 命令
使用移动和分代垃圾收集器。
可移植性
在基于 Unix 的系统上,Mono 提供了一种机制来模拟 Windows 风格的文件访问,
这包括提供不区分大小写的文件系统视图、目录分隔符
映射(从 \ 到 /)并剥离驱动器号。
此功能是通过设置 单声道IOMAP 环境变量之一
全部, 驾驶 和 情况。
见说明 单声道IOMAP 在环境变量部分了解更多详细信息。
运行 配置
可以使用以下选项:
--aot, --aot[=选项]
该选项用于将指定程序集中的CIL代码预编译为native
代码。 生成的代码存储在扩展名为 .so 的文件中。 这个文件
执行程序集时,运行时将自动选取。
如果将 Ahead-of-Time 编译与
-O=all,-shared 标志使代码生成器中的所有优化能够
被执行。 其中一些优化对于 Just-in-Time 来说并不实用
编译,因为它们可能非常耗时。 与 .NET 框架不同,
Ahead-of-Time 编译不会生成域独立代码:它会生成
与 Just-in-Time 编译器生成的代码相同。 由于大多数
应用程序使用单个域,这很好。 如果你想优化
生成用于多域应用程序的代码,请考虑使用 -O=shared
旗帜。 这会预编译方法,但仍需要原始程序集
执行,因为这个包含元数据和异常信息,这不是
在生成的文件中可用。 预编译代码时,您可能希望编译
带有所有优化(-O=all)。 预编译代码是位置无关代码。
预编译只是一种减少启动时间、增加代码共享的机制
跨多个单进程并避免即时编译程序启动
成本。 原始程序集必须仍然存在,因为包含元数据
那里。 AOT 代码通常不能从一台计算机移动到另一台计算机(CPU-
在运行时检测到的特定优化)所以你不应该试图移动
预生成的程序集或打包预生成的程序集用于
部署。 有几个选项可用作参数 --aot 命令行
选项。 选项以逗号分隔,可以指定多个:
自动注册
AOT 编译器将发出一个(仅限 ELF)库初始化程序以自动
向运行时注册 aot 编译模块。 这仅在
静态模式
阿斯蒙
指示 AOT 编译器输出汇编代码而不是对象
文件中。
绑定到运行时版本
如果指定,则强制生成的 AOT 文件绑定到运行时
编译 Mono 的版本。 这将防止 AOT 文件被
由不同的 Mono 运行时使用。 , 这是目前一个
实验功能,因为它不完整。 这指示 Mono
历史上未使用 AOT 预编译的预编译代码。
直接调用
指定此选项时,将直接调用 P/Invoke 方法
通过操作系统符号查找操作。
llvm-路径=
llvm 工具“opt”和“llc”也是如此。
三元=
使用 GNU 风格的目标三元组确定一些代码生成
选项,即 --mtriple=armv7-linux-gnueabi 将生成目标代码
ARMv7。 这目前仅由 ARM 后端支持。 在 LLVM 模式下,
这个三元组被传递给 LLVM llc 编译器。
nimt-蹦床=[数字]
在全 aot 模式下编译时,IMT 蹦床必须在
AOT 图像。 您可以使用此添加其他方法蹦床
争论。 默认为 128。
节点错误
指示 AOT 编译器不输出任何调试信息。
无直接呼叫
这可以防止 AOT 编译器生成对方法的直接调用。
AOT 编译器通常会生成对某些方法的直接调用
不需要通过 PLT(例如,已知的方法
不需要像静态构造函数这样的钩子)或调用简单的内部
调用。
矮人调试
指示 AOT 编译器发出 DWARF 调试信息。 使用时
与 nodebug 选项一起,只有 DWARF 调试信息是
发出,但不是可以在运行时使用的信息。
nrgctx-蹦床=[数量]
在全 aot 模式下编译时,通用共享蹦床必须是
在 AOT 图像中预先创建。 您可以添加其他方法蹦床
这个论点。 默认为 1024。
蹦床=[数量]
以full aot模式编译时,必须预先创建trampolines方法
在 AOT 图像中。 您可以使用此添加其他方法蹦床
争论。 默认为 1024。
输出文件=[文件名]
指示 AOT 编译器将输出保存到指定的文件。
打印跳过方法
如果 AOT 编译器因任何原因无法编译方法,则启用此
flag 会将跳过的方法输出到控制台。
只读值=命名空间.typename.fieldname=类型/值
覆盖静态只读字段的值。 通常,在 JIT 期间
编译时,静态构造函数急切地运行,因此静态的值
readonly 字段在编译时是已知的,编译器可以做一个数字
基于它的优化。 相反,在 AOT 期间,静态构造函数
不能运行,所以这个选项可以用来设置这样一个字段的值
并启用相同的优化集。 类型可以是 i1、i2、i4 中的任何一个,用于
各自大小的整数(以字节为单位)。 请注意,签名/未签名
数字在这里无关紧要,只是存储大小。 这个选项可以
多次指定,它不会阻止静态构造函数
定义在运行时使用通常规则执行的字段的类型
(因此可能为该字段计算不同的值)。
保存温度,保持温度
指示 AOT 编译器保留临时文件。
软调试
这指示编译器生成序列点检查,允许
Mono 的软调试器可以调试应用程序,即使是在它不存在的系统上
可以设置断点或单步执行(某些硬件
配置,如手机和视频游戏机)。
静止 创建可以静态链接的 ELF 对象文件 (.o) 或 .s 文件
嵌入单声道运行时时进入可执行文件。 当这个选项是
使用,目标文件需要使用嵌入式运行时注册
mono_aot_register_module 函数将
mono_aot_module_ 来自目标文件的 _info 全局符号:
外部无效*mono_aot_module_hello_info;
mono_aot_register_module (mono_aot_module_hello_info);
统计 打印 AOT 编译期间收集的各种统计信息。
线程=[数量]
这是 AOT 编译器使用多线程的实验性选项
编译方法时。
工具前缀=
前置到 AOT 编译器运行的工具的名称,即
“作为”/“ld”。 例如,--tool=prefix=arm-linux-gnueabi- 将使 AOT
编译器运行
写符号
指示 AOT 编译器发出调试符号信息。
有关 AOT 的更多信息,请参阅: http://www.mono-project.com/docs/advanced/aot/
--attach=[选项]
目前此命令行参数支持的唯一选项是 关闭 这
禁用附加功能。
--配置 文件名
加载指定的配置文件而不是默认的配置文件。 默认的
文件是 /etc/mono/config 和 ~/.mono/配置 或指定的文件
MONO_CONFIG 环境变量(如果已设置)。 见 单配置(5) 手册页
有关此文件格式的详细信息。
--debugger-agent=[选项]
这指示 Mono 运行时在 Mono 运行时内启动调试代理
并将其连接到客户端用户界面将控制 Mono 进程。 这个
选项通常由 IDE 使用,例如 MonoDevelop IDE。
使用以下选项之一指定配置:
地址=主机:端口
使用此选项指定调试器客户端所在的 IP 地址
听。
日志级别=级别
指定诊断日志级别
日志文件=文件名
用于指定存储日志的文件,默认为
标准输出。
服务器=[y/n]
默认为 no,默认选项 Mono 将主动连接到
主机/端口配置了 地址 选项。 如果你把它设置为“y”,它
指示 Mono 运行时在服务器模式下开始调试,其中 Mono
主动等待调试器前端连接到 Mono 进程。
Mono 将输出到标准输出它正在侦听的 IP 地址和端口。
setpgid=[y/n]
如果设置为 yes,Mono 将调用 设置pgid(0, 0) on 启动时, if 这 功能 is
可使用 on 此 系统。 本篇 is 有用 保证 这 信号 提升
至 a 过程 这 is 执行 此 被调试者 旨在 而不去 传播 至 此
调试器, 例如 ,尤其是 Ctrl-C 发送 SIGINT 至 此 SDB 工具。
暂停=[y/n]
默认为 yes,默认选项 Mono 将在启动时挂起虚拟机
直到它成功连接到调试器前端。 如果你把它设置为
'n',与 服务器=y,它指示 Mono 运行时作为
正常,同时缓存元数据以发送到调试器前端
联系..
运输=运输名称
这用于指定调试器将用于的传输
交流。 它必须被指定,目前要求这是
'dt_socket'。
- 桌面
将虚拟机配置为更适合桌面应用程序。
目前这将 GC 系统设置为尽可能避免扩展堆
以稍微减慢垃圾收集速度为代价。
--full-aot
这是一个实验性标志,指示 Mono 运行时不生成任何
运行时的代码,并且完全依赖于使用单声道生成的代码
--aot=full 以前。 这对于不允许动态的平台很有用
代码生成。 请注意,如果出现以下情况,此功能将在运行时中止执行
程序中的代码路径,或 Mono 的类库尝试生成代码
动态。 你应该预先测试你的软件,并确保你没有
使用任何动态功能。
--gc=博姆, --gc=sgen
选择要使用的 Mono、Boehm 或 SGen 的垃圾收集器引擎。 目前
这只是确保您正在运行 单 or 单基因 命令。
这个标志可以在 MONO_ENV_OPTIONS 环境变量强制所有
您的子进程在 Mono 运行时使用一种特定类型的 GC。
- 帮帮我, -h
显示使用说明。
--llvm 如果 Mono 运行时已使用 LLVM 支持进行编译(并非在所有
配置),Mono 将使用 LLVM 优化和代码生成引擎来
JIT 或 AOT 编译。 如需更多信息,请咨询: http://www.mono-
project.com/docs/advanced/mono-llvm/
--nollvm
当使用支持 LLVM 的 Mono 编译时,它会强制 Mono
回退到它的 JIT 引擎,而不是使用 LLVM 后端。
--优化=模式, -O=模式
MODE 是逗号分隔的优化列表。 它们还允许优化
通过在优化名称前加上减号来关闭。 一般来说,
在将这些标志用于
部署设置,您可能想要实际衡量使用它们的好处。
核心引擎中实现了以下优化标志:
abcrem 数组边界检查删除
all 开启所有优化
aot 使用 Ahead Of Time 编译代码
分支分支优化
cfold 恒定折叠
cmov 条件移动 [arch-dependency]
deadce 死代码消除
consprop 常量传播
copyprop 复制传播
fcmov Fast x86 FP 比较 [arch-dependency]
float32 使用 32 位运算执行 32 位浮点运算
gshared 启用通用代码共享。
内联方法调用
内在方法实现
linears 线性扫描全局 reg 分配
叶 叶程序优化
loop 循环相关的优化
窥孔 窥孔 postpass
precomp 在执行 Main 之前预编译所有方法
sched 指令调度
共享 发出每个域的代码
x2 上的 sse2 SSE86 指令 [arch-dependency]
tailc 尾递归和尾调用
例如,要启用除死代码消除和内联之外的所有优化,
您可以使用:
-O=全部、-deadce、-inline
用 [arch-dependency] 标记的标志表明给定的选项如果
与 Ahead of Time 编译(--aot 标志)结合使用将产生预
编译后的代码将取决于当前的 CPU 并且可能无法安全地移动到
另一台电脑。
支持以下优化
浮动32
请求运行时执行 32 位浮点运算,使用
只有 32 位。 默认情况下,Mono 运行时会尝试使用最高的
精度可用于浮点运算,但虽然这可能
呈现更好的结果,代码可能运行得更慢。 这个选项也
影响 LLVM 后端生成的代码。
一致 控制运行时是否应该尝试内联(默认)
内联方法调用
--运行时=版本
Mono 支持不同的运行时版本。 使用的版本取决于程序
正在运行或其配置文件(名为 program.exe.config)。 这个
选项可用于通过强制不同的运行时来覆盖此类自动检测
要使用的版本。 请注意,这应该仅用于选择以后兼容的
运行时版本比编译程序的版本高。 一个典型的用法是
在 1.1 版本上运行 2.0 程序:
单声道 --runtime=v2.0.50727 程序.exe
- 安全, --安全=模式
激活安全管理器,这是 Mono 中当前的一个实验性功能,它是
默认关闭。 也可以使用此选项启用新的代码验证器。
使用不带参数的 security 等同于使用“cas”调用它
参数。
支持以下模式:
核心-clr
启用 core-clr 安全系统,通常用于
月光/银光应用。 它提供了更简单的安全性
系统比CAS,见 http://www.mono-project.com/docs/web/moonlight/
有关此新系统描述的更多详细信息和链接。
有效
启用新验证器并执行代码有效性的基本验证。
在这种模式下,不安全代码和 P/Invoke 是允许的。 这种模式提供了一个
更好的安全保证,但托管代码仍有可能崩溃
单声道。
可验证
启用新的验证器并执行完整的代码验证
执行。 它只允许执行可验证的代码。 不安全代码是
不允许,但 P/Invoke 是。 此模式不应允许托管代码
崩溃单声道。 验证没有ECMA 335标准那么严格
保持与 MS 运行时兼容。
安全系统作用于用户代码:包含在 mscorlib 或全局变量中的代码
程序集缓存始终受信任。
- 服务器
配置虚拟机以更适合服务器操作
(目前,允许更重的线程池初始化)。
--验证所有
验证全局程序集缓存中的 mscorlib 和程序集的有效 IL,以及所有
IL 可验证性的用户代码。
这不同于 - 安全的可验证或有效,因为这些选项
只检查用户代码并跳过位于全局的 mscorlib 和程序集
程序集缓存。
-V, - 版
打印 JIT 版本信息(系统配置、版本号和分支
名称(如果可用)。
发展 配置
以下选项用于在开发 JIT 应用程序时提供帮助。
-调试, --debug=选项
在运行时打开调试模式。 如果程序集是用编译的
调试信息,它将为堆栈跟踪生成行号信息。
可选的 OPTIONS 参数是一个逗号分隔的调试选项列表。
这些选项在默认情况下是关闭的,因为它们会生成更大更慢的
运行时的代码。
支持以下选项:
施放 抛出 InvalidCastException 时产生详细错误。 这个
需要启用选项,因为这会在执行时生成更详细的代码
时间。
mdb-优化
禁用一些通常只在运行时禁用的 JIT 优化
在调试器里面。 如果您想附加到
使用 mdb 运行进程。
GDB 使用 gdb 生成和注册调试信息。 只支持这个
在某些平台上,并且仅在使用 gdb 7.0 或更高版本时。
--profile[=分析器[:profiler_args]]
打开分析。 有关分析应用程序和代码的更多信息
覆盖范围请参见下面的“分析”和“代码覆盖范围”部分。
这个选项可以多次使用,每次都会加载一个
额外的分析器。 这允许开发人员使用扩展 JIT 的模块
通过 Mono 分析界面。
--trace[=表达式]
在调用时显示方法名称。 默认情况下,所有方法都会被跟踪。 这
可以自定义跟踪以包含或排除方法、类或程序集。 一种
跟踪表达式是一个逗号分隔的目标列表,每个目标都可以加前缀
用减号关闭特定目标。 “程序”、“所有”和
“禁用”具有特殊含义。 “程序”指的是主程序
执行,“all”表示所有的方法调用。 “禁用”选项用于
在禁用跟踪的情况下启动。 它可以在稍后的时间点启用
通过向运行时发送 SIGUSR2 信号来运行程序。 组件由
例如,要跟踪系统程序集中的所有调用,请使用它们的名称:
mono --trace=系统应用程序.exe
类用 T: 前缀指定。 例如,要跟踪对
System.String 类,使用:
单声道--trace=T:System.String app.exe
个别方法用 M: 前缀引用,标准方法
符号:
单声道--trace=M:System.Console:WriteLine app.exe
异常也可以被追踪,它会导致每次打印堆栈追踪
抛出指定类型的异常。 可以指定异常类型
带或不带命名空间,并跟踪所有异常,指定 'all' 作为
类型名称。
单声道--trace=E:System.Exception app.exe
如前所述,可以一次指定各种规则:
单声道--trace=T:System.String,T:System.Random app.exe
您可以排除部分,下一个示例跟踪对 System.String 的调用,除了
System.String:Concat 方法。
单声道--trace=T:System.String,-M:System.String:Concat
您可以使用包装器限定符跟踪托管到非托管的转换:
单声道--trace=wrapper app.exe
最后,可以使用 N: 前缀指定命名空间:
单 --trace=N:System.Xml
--no-x86-堆栈对齐
不要在 x86 架构上对齐堆栈帧。 默认情况下,Mono 对齐堆栈
在 x16 上将帧转换为 86 字节,以便本地浮点和 SIMD 变量可以
正确对齐。 此选项关闭对齐,这通常会保存一个
每次调用的指令,但可能会导致显着降低浮点数和
SIMD 性能。
--jitmap
在 /tmp/perf-PID.map 文件中生成 JIT 方法映射。 然后使用此文件,用于
例如,最近的 Linux 内核中包含的 perf 工具。 文件中的每一行
具有:
HEXADDR HEXSIZE 方法名
目前此选项仅在 Linux 上受支持。
JIT 维护者 配置
维护者选项仅由开发运行时本身的人使用,而不是
通常对运行时用户或开发人员感兴趣。
- 休息 方法
在名为“method”的方法前插入断点
(命名空间。类:方法名)。 使用“Main”作为方法名来插入断点
应用程序的主要方法。 例如,您也可以将它与泛型一起使用
"System.Collections.Generic.Queue`1:Peek"
--breakonex
在异常上插入断点。 这允许您调试您的应用程序
引发异常时的本机调试器。
--编译 姓名
这将编译一个方法 (namespace.name:methodname),用于测试
编译器性能或检查代码生成器的输出。
--编译所有
编译程序集中的所有方法。 这用于测试编译器
性能或检查代码生成器的输出
--graph=类型 方法
这将生成一个带有图表的 postscript 文件,其中包含有关指定的详细信息
方法(命名空间。名称:方法名称)。 这需要 `dot' 和 ghostview
安装(它期望 Ghostview 被称为“gv”)。 以下图表是
可供选择:
cfg 控制流图 (CFG)
dtree 支配树
代码 CFG 显示代码
ssa CFG 显示 SSA 转换后的代码
optcode CFG 显示 IR 优化后的代码
某些图表只有在启用某些优化时才可用。
--n编译
指示运行时使用 --compile 指定的方法的次数
(或所有方法,如果使用 --compileall )要编译。 这用于
测试代码生成器的性能。
--统计
显示有关运行时在执行期间完成的工作的信息
应用程序。
--wapi=hps|semdel
执行进程共享数据的维护。 semdel 将删除全局
信号。 hps 将列出当前使用的句柄。
-v, --详细
增加详细程度,每次列出时,增加详细程度
级别以包含更多信息(例如,包括对
生成的本机代码、代码选择器信息等)。
附 客户服务
Mono 运行时允许外部进程附加到正在运行的进程并加载
程序集到正在运行的程序中。 为了附加到进程,一个特殊的协议是
在 Mono.Management 程序集中实现。
有了这种支持,就可以加载具有入口点的程序集(它们是
使用 -target:exe 或 -target:winexe 创建)以在 Mono 进程中加载和执行。
代码被加载到根域中,并在特殊的运行时开始执行
附加线程。 附加的程序应该创建自己的线程并在之后返回
调用。
这种支持允许例如通过附加 csharp shell 来调试应用程序
到正在运行的进程。
剖析
Mono 运行时包括一个分析器,可用于探索各种性能
您的应用程序中的相关问题。 通过传递 --profile 激活分析器
Mono 运行时的命令行参数,格式为:
--profile[=分析器[:profiler_args]]
Mono 有一个名为“default”的内置分析器(如果没有参数,也是默认值)
指定),但开发人员可以编写自定义分析器,请参阅“自定义分析器”部分
,了解更多详情。
如果一个 探查 未指定,则使用默认分析器。 这 分析器参数 是一个
探查器本身的探查器特定选项字符串。 默认分析器接受
以下选项“alloc”用于分析应用程序的内存消耗; “时间”到
分析在每个例程上花费的时间; 'jit' 收集 JIT 编译方法所花费的时间
和 'stat' 执行样本统计分析。 如果没有提供选项
默认为'alloc,time,jit'。
默认情况下,配置文件数据打印到标准输出:要更改此设置,请使用 'file=filename'
将数据输出到文件名的选项。 例如:
单声道 --profile 程序.exe
这将使用默认分析器运行程序,并进行时间和分配
分析。
单声道--profile=default:stat,alloc,file=prof.out program.exe
将对 program.exe 进行样本统计分析和分配分析。 简介
数据放在 prof.out 中。 请注意,统计分析器的开销非常低,并且
应该是首选的分析器(为了更好的输出,使用单声道的完整路径
运行时二进制文件并确保您已安装来自的 addr2line 实用程序
binutils 包)。
登录 型材
这是最先进的分析器。
单声道 日志 profiler 可用于收集有关程序运行的大量信息
在 Mono 运行时中。 可以使用此数据(在进程运行时和之后)
对程序行为进行分析,确定资源使用情况、性能问题或
甚至寻找特定的执行模式。
这是通过记录 Mono 运行时提供的事件来完成的
分析接口并定期将它们写入一个文件,以便以后检查
与 mprof-报告(1) 工具。
有关如何使用日志分析器的更多信息,请访问 mprof-报告(1)
页面。
定制 配置文件
Mono 提供了一种以共享的形式加载其他分析模块的机制
图书馆。 这些分析模块可以连接到 Mono 运行时的各个部分以
收集有关正在执行的代码的信息。
要使用第三方分析器,您必须将分析器的名称传递给 Mono,如下所示:
mono --profile=自定义程序.exe
在上面的示例中 Mono 将从共享库中加载用户定义的分析器
`mono-profiler-custom.so'。 此分析器模块必须位于您的动态链接器库中
路径。
Mono 的网站 (www.mono-
project.com/docs/advanced/performance-tips/)
自定义配置文件被编写为共享库。 共享库必须被称为`mono-
profiler-NAME.so' 其中“NAME”是您的分析器的名称。
有关如何编写自己的自定义分析器的示例,请查看 Mono 源代码树中的 in
样品/分析器.c。
守则 覆盖范围
Mono 附带了一个代码覆盖模块。 该模块是通过使用 Mono 激活的
--profile=cov 选项。 格式为: --profile=cov[:程序集名称[/命名空间]] 测试-
suite.exe
默认情况下,代码覆盖率将默认为所有加载的程序集,您可以通过
指定程序集名称,例如在您的例程中执行代码覆盖
程序使用,例如以下命令行将代码覆盖率限制为例程
在“演示”程序集中:
单声道--profile=cov:demo demo.exe
注意, 程序集名称 不包括扩展名。
您可以通过指定命名空间来进一步限制代码覆盖率输出:
单--profile=cov:demo/My.Utilities demo.exe
这只会在给定的程序集和命名空间中执行代码覆盖。
典型的输出如下所示:
未涵盖:Class:.ctor()
不包括:Class:A ()
未涵盖:Driver:.ctor()
未涵盖:驱动程序:方法()
部分覆盖:Driver:Main()
偏移量 0x000a
显示的偏移量是 IL 偏移量。
`monocov' 模块中提供了一个更强大的覆盖工具。 见 单冠状病毒(1)
手册页了解详情。
调试 艾滋病
要调试托管应用程序,您可以使用 MDB command,一个命令行调试器。
可以通过发送 Mono 中所有活动线程的堆栈跟踪
QUIT 信号给 Mono,您可以从命令行执行此操作,如下所示:
杀死-退出 pid
其中 pid 是您要检查的 Mono 进程的进程 ID。 该过程将
之后继续运行,但不保证其状态。
重要提示: 这是调试应用程序的最后手段,不应
用于监视或探测生产应用程序。 运行后的完整性
不保证发送此信号,应用程序可能会崩溃或终止
之后给定的点。
这款 --debug=强制转换 选项可用于获取 Invalid Cast 的更多详细信息
操作,它将提供有关所涉及类型的信息。
您可以使用 MONO_LOG_LEVEL 和 MONO_LOG_MASK 环境变量来获取详细信息
调试有关在 Mono 中执行应用程序的输出。
这款 单声道_日志_级别 环境变量如果设置,日志级别更改为设置
价值。 可能的值为“错误”、“严重”、“警告”、“消息”、“信息”、“调试”。 这
默认值为“错误”。 日志级别大于或等于日志的消息
level 将被打印到 stdout/stderr。
使用“info”来跟踪程序集的动态加载。
使用 MONO_LOG_MASK 环境变量来限制您收到的消息的范围:如果
设置,日志掩码更改为设置值。 可能的值是“asm”(汇编
loader)、“type”、“dll”(本机库加载器)、“gc”(垃圾收集器)、“cfg”(配置
文件加载器)、“aot”(预编译器)、“安全性”(例如 Moonlight CoreCLR 支持)和“全部”。
默认值为“全部”。 更改掩码值允许您仅显示消息
对于某个组件。 您可以使用逗号分隔多个掩码。 例如
要查看配置文件消息和程序集加载器消息,请将掩码设置为“asm,cfg”。
以下是跟踪 P/Invoke 问题的常见用法:
$ MONO_LOG_LEVEL="调试" MONO_LOG_MASK="dll" 单胶.exe
调试 与 本地数据库
如果您使用的是 LLDB,则可以使用 单声道 打印一些内部数据的脚本
结构与它。 要使用它,请将其添加到您的 $HOME/.lldbinit 文件:
命令脚本导入 $PREFIX/lib/mono/lldb/mono.py
其中 $PREFIX 是您在配置 Mono 时使用的前缀值(通常是 在/ usr).
完成后,您可以检查一些 Mono Runtime 数据结构,例如:
(lldb) p 方法
(MonoMethod *) $0 = 0x05026ac0 [mscorlib]System.OutOfMemoryException:.ctor()
序列化
默认情况下,Mono 的 XML 序列化引擎将使用基于反射的方法
序列化,这对于连续处理(Web 服务应用程序)来说可能很慢。 这
序列化引擎将决定类何时必须使用手动调整的序列化器
一些参数,如果需要,它将为您的类型生成自定义的 C# 序列化程序
在运行时。 然后这个自定义的序列化程序会动态加载到您的
应用程序。
您可以使用 MONO_XMLSERIALIZER_THS 环境变量来控制它。
可能的值为 ‘不’ 禁用 C# 自定义序列化程序的使用,或
运行时将产生自定义之前的最小使用次数的整数
序列化器(0 将在第一次访问时产生一个自定义序列化器,50 将产生一个
第 50 次使用序列化程序)。 如果
序列化程序生成以某种方式失败。 可以通过设置选项禁用此行为
‘无后备’ (例如:MONO_XMLSERIALIZER_THS=0,nofallback)。
环境 变数
GC_DONT_GC
在 Mono 中关闭垃圾收集。 这应该只用于调试
目的
LVM_COUNT 个
当使用 LLVM 支持编译 Mono 时,这会指示运行时停止使用
在指定数量的方法之后的 LLVM 被 JIT。 这是一个使用的工具
诊断以帮助隔离代码生成后端中的问题。 例如
LLVM_COUNT=10 只会用 LLVM 编译 10 个方法,然后切换到 Mono
JIT引擎。 LLVM_COUNT=0 将完全禁用 LLVM 引擎。
MONO_AOT_缓存
如果设置,此变量将指示 Mono 提前编译新程序集
请求并将结果存储到缓存中 ~/.mono/aot-cache。
MONO_ASPNET_INHIBIT_SETTINGSMAP
Mono 包含允许修改 .config 文件中的设置的功能
使用配置部分映射器随 Mono 一起提供。 映射器和映射
规则在 $prefix/etc/mono/2.0/settings.map 文件中定义,并且可以选择在
在 ASP.NET 应用程序的顶级目录中找到的 settings.map 文件。
System.Web 在应用程序启动时读取这两个文件,如果它们位于
以上位置。 如果您不想执行映射,则可以设置此项
启动应用程序之前环境中的变量,并且不会执行任何操作
拍摄。
MONO_ASPNET_WEBCONFIG_CACHESIZE
Mono 有一个缓存 ConfigSection 对象,用于加速 WebConfigurationManager
查询。 它的默认大小是 100 个项目,当需要更多项目时,缓存
驱逐开始发生。 如果驱逐过于频繁,这可能会导致
不必要的开销,可以通过使用此环境变量来避免
设置更高的缓存大小(或通过减少它来降低内存需求)。
MONO_CAIRO_DEBUG_DISPOSE
如果设置,会导致 Mono.Cairo 在分配对象时收集堆栈跟踪,因此
完成/处置警告包括有关实例的信息
起源。
单声道配置目录
如果设置,此变量将覆盖默认系统配置目录
($前缀/等)。 它用于定位 machine.config 文件。
MONO_COM
设置 COM 互操作的样式。 如果此变量的值为“MS” Mono 将使用
来自 liboleaut32 的 BSTR 类型库的字符串编组例程,任何
其他值将使用单内置 BSTR 字符串编组。
单声道配置
如果设置,此变量将覆盖默认的运行时配置文件
($PREFIX/etc/mono/config)。 --config 命令行选项覆盖
环境变量。
MONO_CPU_ARCH
覆盖自动 CPU 检测机制。 目前仅用于手臂。 这
值的格式如下:
“armvV [拇指[2]]”
其中 V 是架构编号 4、5、6、7,选项当前可以是
“拇指”或“拇指2”。 例子:
MONO_CPU_ARCH="armv4 thumb" 单声道 ...
MONO_ARM_FORCE_SOFT_FLOAT
当 Mono 在 ARM 上使用软浮点回退构建并且此变量设置为
“1”,Mono 将始终发出软浮点代码,即使检测到 VFP 单元。
MONO_DISABLE_AIO
如果设置,则告诉单声道不要尝试使用本机异步 I/O 服务。 在那里面
在这种情况下,使用默认的选择/轮询实现。 目前只有 epoll() 是
支持的。
MONO_DISABLE_MANAGED_COLLATION
如果此环境变量为“是”,则运行时使用非托管归类(即
实际上意味着没有文化敏感的排序规则)。 它在内部禁用托管
通过 System.Globalization.CompareInfo 的成员调用的整理功能
班级。 默认情况下启用排序规则。
MONO_DISABLE_SHM
仅限 Unix:如果设置,则禁用用于跨进程句柄的共享内存文件:
进程只有私有句柄。 这意味着进程和线程句柄是
不可用于其他进程、命名互斥体、命名事件和命名
信号量在进程之间不可见。 这也可以通过
默认通过传递“--disable-shared-handles”选项来配置。 这是
从单声道 2.8 开始默认。
MONO_DISABLE_SHARED_AREA
仅限 Unix:如果设置,则禁用共享内存以暴露性能
柜台。 这意味着不可能同时从外部读取性能
来自该进程的计数器或读取外部进程的计数器。
MONO_DNS
设置后,启用使用完全托管的 DNS 解析器而不是常规的
libc 函数。 当运行多个查询时,此解析器的性能要好得多
平行。
需要注意的是 /etc/nsswitch.conf 将被忽略。
单声道EGD_套接字
对于没有其他方式获取随机字节的平台,这可以
设置为 egd 或 prngd 守护进程所在的文件系统套接字的名称
听。
MONO_ENABLE_SHM
仅限 Unix:启用对跨进程句柄的支持。 跨进程句柄是
用于公开进程句柄、线程句柄、命名互斥体、命名事件和
跨 Unix 进程的命名信号量。
MONO_ENV_OPTIONS
此环境变量允许您将命令行参数传递给 Mono
通过环境的过程。 这很有用,例如强制您的所有
Mono 处理使用 LLVM 或 SGEN,而无需修改任何启动脚本。
MONO_ENV_OPTIONS
用于在运行时将额外选项传递给调试器代理,因为它们是
使用 --debugger-agent= 传递。
MONO_EVENTLOG_TYPE
设置要使用的事件日志提供程序的类型(对于 System.Diagnostics.EventLog)。
可能的值为:
本地[:路径]
将事件日志和条目保留到本地文件系统。 目录在
可以指定哪些来持久化事件日志、事件源和条目
作为价值的一部分。 如果未明确设置路径,则默认为
unix 上的“/var/lib/mono/eventlog”和 Windows 上的“%APPDATA%no\ventlog”。
win32 使用 此 本地人 win32 API 至 写 事件 和 寄存器 活动 日志 和 活动
注册表中的来源。 这仅在 Windows 上可用。 在 Unix 上,
单个事件日志和事件源目录的目录权限
设置为 777(带 +t 位)允许每个人读取和写入事件日志
条目,而只允许条目被用户删除
创造了它们。
空 静默丢弃任何事件。
在 Unix(以及 NT 之前的 Windows 版本)上默认为“null”,在 Unix 上默认为“win32”
Windows NT(及更高版本)。
单声道外部编码
如果设置,则包含以冒号分隔的文本编码列表,以在转动时尝试
外部生成的文本(例如命令行参数或文件名)转换为 Unicode。
编码名称来自 iconv 提供的列表,特殊情况
“default_locale” 指的是当前语言环境的默认编码。
读取外部生成的文本字符串时,首先尝试 UTF-8,然后是这个
list 按顺序尝试,第一个成功转换结束搜索。
当写入外部文本(例如新文件名或新进程的参数)时,
使用此列表中的第一项,如果未设置环境变量,则使用 UTF-8。
使用 MONO_EXTERNAL_ENCODINGS 处理文件的问题在于
导致一个问题:虽然它可能获得正确的文件名,但它不是
一定有可能打开文件。 一般来说,如果你有问题
文件名中的编码,您应该使用“convmv”程序。
MONO_GC_PARAMS
当 Mono 与 SGen 垃圾收集器一起使用时,此变量控制多个
采集器参数变量的值是逗号分隔的列表
话。
苗圃大小=尺寸
设置托儿所的大小。 大小以字节为单位指定,并且必须是
两个的力量。 后缀“k”、“m”和“g”可用于指定公斤、
分别为兆字节和千兆字节。 托儿所是第一代(
二)。 较大的托儿所通常会加快程序,但显然会
使用更多内存。 默认苗圃大小为 4 MB。
专业=集电极 指定要使用的主要收集器。
选项是 Mark&Sweep 收集器的“marksweep”和“marksweep-conc”
用于并发标记和扫描。 非并发 Mark&Sweep 收集器是
默认。
软堆限制=尺寸
一旦堆大小变得大于这个大小,忽略默认的主要内容
收集触发指标说并且只允许四个托儿所大小的专业
主要集合之间的堆增长。
疏散阈值=门槛
以百分比设置疏散阈值。 此选项仅适用于
Mark&Sweep 的主要收藏家。 该值必须是范围内的整数
0 到 100。默认为 66。如果集合的扫描阶段发现
特定堆块类型的占用率小于此
百分比,它将在下一个块类型中进行复制集合
主要收藏,从而使入住率恢复到接近 100%。 一种
值 0 关闭疏散。
(no-)懒惰的扫描
为 Mark&Sweep 收集器启用或禁用延迟扫描。 如果启用,
每当
需要出现,通常是在苗圃收集期间。 已启用懒惰扫描
默认情况下。
(无)并发扫描
为 Mark&Sweep 收集器启用或禁用并发扫描。 如果
启用,所有主要块的迭代以确定哪些可以
释放以及哪些必须保留和清除,与
正在运行的程序。 默认情况下启用并发扫描。
堆栈标记=标记模式
指定应如何扫描应用程序线程。 选项是“精确”的
和`保守`。 精确的标记让收集者知道什么值
堆栈上是引用,什么不是。 保守标记威胁所有
值作为潜在的引用并保持不变。 精准打标
减少漂浮垃圾,加速托儿所收集和分配
率,它的缺点是每个需要大量额外内存
编译方法。 不幸的是,正确的选择需要实验。
保存目标比率=比
指定主要收集器的目标保存率。 收藏家让
由于未成年人需要从托儿所提升一定数量的内存
在触发主要收集之前收集。 该金额基于
它期望释放多少内存。 它表示为大小的比率
主要收集后的堆。 有效值介于 0.1 和 2.0 之间。
默认值为 0.5。 较小的值将使主堆大小更小
但会触发更多的主要收藏。 同样,更大的值将使用
更多的内存并导致主要集合的频率降低。 这个选项是
实验性的,所以它可能会在以后的单声道版本中消失。
默认津贴比率=比
指定计算大小过大时的默认分配限额
小的。 分配余量是收集器允许的内存量
在引发重大收藏之前推广。 是托儿所的比例
尺寸。 有效值介于 1.0 和 10.0 之间。 默认值为 4.0。 较小
值导致较小的堆和更频繁的主要集合。 同样地,
更大的值将使堆增长得更快,但在它出现时使用更多的内存
达到稳定的大小。 此选项是实验性的,因此它可能会消失
在单声道的更高版本中。
次要=小收藏家
指定要使用的次要收集器。 选项是“简单的”,促进
所有对象从托儿所直接到老年代并“分裂”
这让对象在提升之前在托儿所停留的时间更长。
分配比率=比
指定分配空间要使用的托儿所的内存比率。
这只能与拆分次要收集器一起使用。 有效值为
1 到 100 之间的整数。默认值为 60。
晋升年龄=年龄
指定对象在托儿所内必须达到的所需年龄
被提升到老一代。 这只能与
拆分次要收集器。 有效值为 1 到 14 之间的整数。默认值
是2。
(无)水泥
启用或禁用固井。 这可以大大缩短托儿所
一些参考固定对象的基准测试的收集时间
从主要堆。
MONO_GC_DEBUG
将 Mono 与 SGen 垃圾收集器一起使用时,此环境变量可以是
用于开启收集器的各种调试功能。 这的价值
变量是逗号分隔的单词列表。 不要使用这些选项
生产。
数 将调试级别设置为指定的数字。
印刷津贴
在每个主要集合之后打印之前和之后的内存消耗
小收藏家的收藏和津贴,即有多少
允许堆在下一个主要集合之前从次要集合增长
收集被触发。
印刷别针
收集对象被固定在托儿所中的类的统计信息
并为其添加全局 remset 条目。 打印这些统计信息时
关闭。
先收集再分配
检查小集合
这对次要集合执行一致性检查,并清除
收集时的托儿所,而不是默认值,当缓冲区为
已分配 (clear-at-gc)。 一致性检查确保没有
主要到不在记忆集中的次要参考。
模块联合一致性检查
每次完成前检查 mod-union cardtable 是否一致
主要收集暂停。 此检查仅适用于并发专业
收藏家。
复选标记位
检查主堆中的标记位在每个结束时是否一致
主要收藏。 一致的标记位意味着如果一个对象被标记,
它所引用的所有对象也必须被标记。
检查托儿所固定
在托儿所收集之后,在开始并发收集之前,检查
是否所有托儿所对象都固定或不固定 - 取决于
语境。 使用拆分苗圃收集器时不执行任何操作。
xdomain-检查
执行检查以确保没有引用留给卸载的
应用程序域。
清晰的实验室创建
当线程本地分配缓冲区时,增量清除 Nursery
(TLAB) 创建。 默认设置在 GC 时清除整个 Nurseries
时间。
在创建时调试清除
当线程本地分配缓冲区时,增量清除 Nursery
(TLAB) 被创建,但在 GC 时用字节“0xff”填充它,它
如果`clear-at-tlab-creation`没有,应该会更快地导致崩溃
好好工作。
清除在 gc
这会在 GC 时清除 Nurseries 而不是在线程本地时执行
创建分配缓冲区 (TLAB)。 默认是在以下时间清除托儿所
TLAB 创建时间。
禁用未成年人
不要做小收藏。 如果托儿所已满,则主要收集
改为触发,除非它也被禁用。
禁用主要
不要做大集合。
保守堆栈标记
强制 GC 保守地扫描堆栈,即使是精确扫描
可用。
无管理分配器
禁用托管分配器。
检查扫描开始
如果设置,则在每次之前和之后对 scan_starts 进行合理性检查
采集
验证-托儿所-at-minor-gc
如果设置,则在每次开始时对托儿所进行完整的对象遍历
小收藏。
转储托儿所在次要 gc
如果设置,则在每个未成年人开始时转储托儿所的内容
收藏。 需要设置 verify-nursery-at-minor-gc。
堆转储=文件
将堆内容转储到指定文件。 为了形象化
信息,使用 mono-heapviz 工具。
二进制协议=文件
将调试输出输出到指定文件。 为此,Mono
需要使用 sgen-gc.c 上的 BINARY_PROTOCOL 定义进行编译。 你可以
然后使用此命令探索输出
sgen-grep-binprot 0x1234 0x5678 < 文件
托儿所金丝雀
如果设置,则在托儿所中分配的对象后缀为金丝雀(守卫)
word,在每个小集合上检查。 可用于检测/调试
堆损坏问题。
不敲定
如果启用,终结器将不会运行。 其他一切都不会受到影响:
可终结对象仍将被放入终结队列中
生存,直到他们预定完成。 一旦他们不在队列中
它们将被定期收集。
日志终结器
详细记录完成过程以帮助调试。
MONO_GAC_PREFIX
提供运行时用于查找全局程序集缓存的前缀。 目录
由平台路径分隔符(unix 上的冒号)分隔。 MONO_GAC_PREFIX
应该指向前缀安装的顶级目录。 或者到目录
gacutil /gacdir 命令中提供。 例子:
/home/用户名/.mono:/usr/local/mono/
单声道IOMAP
启用某些文件名重写支持以帮助编写错误的应用程序
硬编码 Windows 路径。 设置为以冒号分隔的“驱动器”列表以剥离驱动器
字母,或“大小写”在一个目录中的每个目录中进行不区分大小写的文件匹配
小路。 “all”启用所有重写方法。 (反斜杠总是映射到
如果此变量设置为有效选项,则为斜线)。
例如,这将在 shell 中工作:
MONO_IOMAP=驱动器:案例
导出 MONO_IOMAP
如果您使用 mod_mono 来托管您的 Web 应用程序,您可以使用 单IOMAP
指令代替,像这样:
单IOMAP 全部
参见 模组单声道(8) 了解更多详情。
此外。 Mono 包括一个分析器模块,它允许人们跟踪什么
调整 IOMAP 代码需要做的文件路径。 跟踪代码报告
进行 IOMAP 调用的托管位置(完整堆栈跟踪),以及
进程退出,在托管中创建所有 IOMAP 字符串的位置
代码。 后一个报告只是近似值,因为并非总是可以
估计创建字符串的实际位置。 代码使用简单
启发式 - 它分析导致字符串分配位置的堆栈跟踪
并忽略 GAC 中安装的程序集中的所有托管代码
就像在 Mono 附带的类库中一样(因为它们被假定为没有
区分大小写的问题)。 然后它报告用户代码中的第一个位置 -
在大多数情况下,这将是分配字符串的地方或非常接近
那个地点。 报告代码作为自定义分析器模块实现(请参阅
“PROFILING”部分)并且可以通过以下方式加载:
单声道--profile=iomap yourapplication.exe
但是请注意,Mono 当前一次仅支持一个分析器模块。
MONO_LLVM
当 Mono 使用 LLVM 代码生成后端时,您可以使用此环境
将代码生成选项传递给 LLVM 编译器的变量。
MONO_MANAGED_WATCHER
如果设置为“禁用”,System.IO.FileSystemWatcher 将使用文件观察器
默默地忽略所有观看请求的实现。 如果设置为任何
其他值,System.IO.FileSystemWatcher 将使用默认托管
实施(缓慢)。 如果未设置,mono 将尝试使用 inotify、FAM、Gamin、kevent
在 Unix 系统和 Windows 上的本机 API 调用下,回退到托管
错误的执行。
MONO_MESSAGING_PROVIDER
Mono 支持一个插件模型来实现 System.Messaging
可能支持各种消息传递实现(例如 AMQP、ActiveMQ)。
要指定要使用哪个消息传递实现,请使用 evironement 变量
需要设置为提供者的完整类名。 例如使用 RabbitMQ
基于 AMQP 实现的变量应设置为:
Mono.Messaging.RabbitMQ.RabbitMQMessagingProvider,Mono.Messaging.RabbitMQ
MONO_NO_SMP 单声道
如果设置导致单进程绑定到单个处理器。 这可能是
在调试或解决竞争条件时很有用。
MONO_NO_TLS
禁用线程本地访问的内联。 如果出现段错误,请尝试设置此项
在mono的早期执行。
单路径
提供运行时的搜索路径,在其中查找库
文件。 这是一个方便调试应用程序的工具,但是
不应由已部署的应用程序使用,因为它会破坏程序集
装载机以微妙的方式。
目录由平台路径分隔符(unix 上的冒号)分隔。 例子:
/home/用户名/lib:/usr/local/mono/lib
相对路径是根据启动时当前目录解析的。
MONO_PATH 的替代解决方案包括:将库安装到
全局程序集缓存(请参阅 加库利(1)) 或有受抚养人
库与主可执行文件并排。
有关推荐的应用实践的完整描述
部署,见
http://www.mono-project.com/docs/getting-started/application-deployment/
单声道实时时钟
统计分析器中的实验性 RTC 支持:如果用户有
许可,收集更准确的统计数据。 MONO_RTC
值必须限制在 Linux rtc 允许的范围内:XNUMX 的幂
从 64 到 8192 赫兹。 要启用更高的频率,例如 4096 Hz,请以 root 身份运行:
回声 4096 > /proc/sys/dev/rtc/max-user-freq
例如:
MONO_RTC=4096 单声道--profiler=default:stat program.exe
MONO_SHARED_DIR 目录
如果将其设置为存储“.wapi”句柄状态的目录。 这是
Windows I/O 仿真层存储其共享状态数据的目录
(文件、事件、互斥体、管道)。 默认情况下 Mono 将存储“.wapi”目录
在用户的主目录中。
MONO_SHARED_HOSTNAME
使用此变量的字符串值作为主机名的替代
在“.wapi”目录中创建文件名。 如果您的主机名
当单声道应用程序正在运行或者您有一个
.wapi 目录在几台不同的计算机之间共享。 Mono 通常使用
用于创建用于在多个 Mono 之间共享状态的文件的主机名
过程。 这样做是为了支持可能通过以下方式共享的主目录
网络。
MONO_STRICT_IO_EMULATION
如果设置,则在 IO 操作期间进行额外检查。 目前,这仅包括
围绕文件写入的咨询锁。
MONO_主题
Windows.Forms 要使用的主题的名称。 今天可用的主题包括
“clearlooks”、“nice”和“win32”。 默认值为“win32”。
MONO_TLS_SESSION_CACHE_TIMEOUT
SSL/TLS 会话缓存将保留其条目以避免的时间(以秒为单位)
客户端和服务器之间的新协商。 谈判很CPU
密集,因此特定于应用程序的自定义值可能证明对小型
嵌入式系统。 默认值为 180 秒。
MONO_THREADS_PER_CPU
一般线程池中的最小线程数为
MONO_THREADS_PER_CPU * CPU 数量。 此变量的默认值为 1。
MONO_XMLSERIALIZER_THS
控制 XmlSerializer 的阈值以生成自定义序列化程序
给定的类而不是使用基于反射的解释器。 可能的值
是“no”以禁用自定义序列化程序的使用或数字以指示何时
XmlSerializer 应该开始序列化。 默认值为 50,这意味着
自定义序列化程序将在第 50 次使用时生成。
MONO_X509_REVOCATION_MODE
设置验证 X509 证书链 (https,
ftps、smtps...)。 默认值为“nocheck”,它在以下位置不执行吊销检查
全部。 其他可能的值是 'offline',它执行 CRL 检查(不是
尚未实施)和“在线”,它使用 OCSP 和 CRL 来验证吊销
状态(尚未实现)。
环境 变数 用于 调试
MONO_ASPNET_NODELETE
如果设置为任何值,ASP.NET 支持类生成的临时源文件
不会被删除。 它们将保存在用户的临时目录中。
单声道调试
如果设置,则启用对调试有用的运行时的某些功能。 这个变量
应该包含一个逗号分隔的调试选项列表。 目前,该
支持以下选项:
未经证实的中断
如果设置了这个变量,当 Mono VM 遇到验证问题时,
它不会抛出异常,而是闯入调试器。 这是
在调试验证器问题时很有用
施放 此选项可用于从 InvalidCast 获取更多详细信息
例外,它将提供有关所涉及类型的信息。
收集页面错误统计信息
收集有关页面错误的信息。 这在内部用于跟踪
为加载元数据而产生的页面错误数。 要显示这个
您必须将此选项与“--stats”命令行选项一起使用。
非免费域名
这是针对多 AppDomain 应用程序的优化(最常见的是
ASP.NET 应用程序)。 由于内部限制 Mono,默认为 Mono
不在多应用程序域应用程序上使用类型化分配,因为它们可以
卸载域时泄漏内存。 虽然这是一个很好的默认值,但对于
大量使用 AppDomain 以外的应用程序(例如,ASP.NET
应用程序)值得用小泄漏换取增加
性能(此外,因为 ASP.NET 应用程序不太可能
卸载生产系统上的应用程序域,值得使用
此功能)。
动态运行时调用
指示运行时尝试使用通用运行时调用包装器代替
创建一个调用包装器。
GDB 相当于设置 MONO_XDEBUG 变量,这会将符号发出到一个
共享库,因为代码是 JITed,可以加载到 GDB 中进行检查
符号。
基因序列点
自动生成 IL 堆栈为空的序列点。 这些
是调试器可以设置断点的地方。
显式空检查
使 JIT 对变量取消引用生成显式 NULL 检查
而不是依赖操作系统来引发 SIGSEGV 或其他
访问无效内存位置时的陷阱事件形式。
句柄签名
捕获中断信号 (Control-C) 并在以下情况下显示堆栈跟踪
按下。 用于找出程序在给定位置执行的位置
观点。 这仅显示单个线程的堆栈跟踪。
初始化堆栈
指示运行时使用一些已知值 (0x2a
在 x86-64 上)在帮助调试 JIT 引擎的方法的开始。
保留代表
此选项将泄漏不再引用为的委托蹦床
向用户提供有关委托滥用的更多信息。
基本上可以创建一个委托实例,传递给非托管代码,
并且没有引用保留在托管代码中,这将垃圾收集代码。
使用此选项可以追踪问题的根源。
反向调用异常
此选项将导致单声道在期间中止并显示描述性消息
在异常到达本机堆栈帧后堆栈展开。 这个
当托管委托传递给本机代码时发生,并且托管委托
委托抛出异常。 Mono 通常会尝试将堆栈展开到
第一个(托管)异常处理程序,它将跳过任何本机堆栈
过程中的帧。 这会导致未定义的行为(因为 mono 没有
知道如何处理本机帧)、泄漏和可能的崩溃。
没有-gdb-回溯
此选项将禁用运行时发出的 GDB 回溯
非托管代码中的 SIGSEGV 或 SIGABRT。
sigsegv 挂起
当收到本机 SIGSEGV 时,此选项将挂起程序。
这对于调试不会在 gdb 下发生的崩溃很有用,因为
实时进程包含比核心文件更多的信息。
检查pinvoke-callconv
此选项会导致运行时检查调用约定不匹配
使用 pinvoke 时,即混合 cdecl/stdcall。 它仅适用于 Windows。 如果
检测到不匹配,则抛出 ExecutionEngineException。
单声道_日志_级别
日志记录级别,可能的值为“错误”、“严重”、“警告”、“消息”、
“信息”和“调试”。 有关更多详细信息,请参阅调试部分。
MONO_LOG_MASK
控制将应用日志记录的 Mono 运行时的域。 如果设置,则
日志掩码更改为设置值。 可能的值是“asm”(程序集加载器),
“type”、“dll”(本地库加载器)、“gc”(垃圾收集器)、“cfg”(配置文件)
loader)、“aot”(预编译器)、“security”(例如 Moonlight CoreCLR 支持)和
“全部”。 默认值为“全部”。 更改掩码值允许您显示
仅针对某个组件的消息。 您可以通过逗号使用多个掩码
将它们分开。 例如查看配置文件消息和程序集加载器
消息将您的掩码设置为“asm,cfg”。
MONO_TRACE
用于方法调用的运行时跟踪。 逗号分隔的跟踪格式
选项是:
[-]M:方法名
[-]N:命名空间
[-]T:类名
[-]全部
[-]程序
禁用 跟踪输出在启动时关闭。
您可以打开/关闭向程序发送 SIGUSR2 信号的跟踪输出。
MONO_TRACE_Listener
如果设置,则启用 System.Diagnostics.DefaultTraceListener,它将打印
System.Diagnostics Trace 和 Debug 类的输出。 它可以设置为
文件名,然后到 Console.Out 或 Console.Error 以将输出显示到标准输出
或标准误差,分别。 如果它设置为 Console.Out 或 Console.Error 你
可以附加一个可选前缀,在编写这样的消息时将使用该前缀:
控制台错误:我的程序名称。 请参阅 System.Diagnostics.DefaultTraceListener
文档以获取更多信息。
MONO_WCF_TRACE
这通过简单地输出所有日志消息来简化 WCF 诊断功能
WCF 引擎将“stdout”、“stderr”或任何文件传递给此环境变量。
日志格式与通常的诊断输出相同。
MONO_X异常
这在遇到 X11 错误时抛出异常; 默认情况下,消息是
显示但继续执行
MONO_XMLSERIALIZER_DEBUG
将此值设置为 1 以防止序列化程序删除临时文件
为快速序列化而创建的; 这在调试时可能很有用。
MONO_XSYNC 单声道
当与 X11 一起运行时,这在 System.Windows.Forms 实现中使用
后端。 这用于调试 Windows.Forms 中的问题,因为它强制所有
命令发送到 X11 服务器以同步完成。 默认模式为
操作是异步的,这使得很难隔离某些根
问题。
MONO_GENERIC_SHARING
此环境变量控制所使用的通用共享类型。 这个变量
由内部 JIT 开发人员使用,不应在生产中更改。 不要
用它。 变量控制哪些类将具有通用代码共享
启用。 允许的值为:
所有 所有生成的代码都可以共享。
收藏
只有 System.Collections.Generic 中的类才会共享其代码
(这是默认值)。
科利布 只有 corlib 中的代码才会共享其代码。
没有 不会执行通用代码共享。
默认情况下,通用代码共享仅适用于集合。 默认情况下的 Mono JIT
打开这个。
MONO_XDEBUG
当设置 MONO_XDEBUG 环境变量时,会发出 JITted 代码的调试信息
到共享库,可加载到 gdb。 例如,这使您能够查看托管
gdb 回溯上的帧名称。
MONO_VERBOSE_METHOD
为指定的方法启用最大 JIT 详细程度。 这很有帮助
诊断特定方法的错误编译问题。
MONO_VERBOSE_HWCAP
如果设置,则使 JIT 输出有关检测到的 CPU 功能(例如 SSE、
CMOV、FCMOV 等)到标准输出。
MONO_CONSERVATIVE_HWCAP
如果设置,JIT 将不执行任何硬件能力检测。 这可能是
有助于查明 JIT 问题的原因。 这是 Mono 构建时的默认设置
作为 AOT 交叉编译器,因此生成的代码可以在大多数硬件上运行。
瓦尔格林
如果你想使用 Valgrind,你会发现文件 `mono.supp' 很有用,它包含了
触发不正确警告的 GC 抑制。 像这样使用它:
valgrind --suppressions=mono.supp 单...
数据跟踪
在某些平台上,Mono 可以公开一组 DTrace 探针(也称为用户空间
静态定义,USDT 探针)。
它们在文件`mono.d'中定义。
ves-init-开始, ves-init-结束
运行时初始化的开始和结束。
方法编译开始, 方法编译结束
方法编译的开始和结束。 探针参数是类名、方法
名称和签名,以及在方法编译结束成功或失败的情况下
汇编。
gc-开始, GC结束
垃圾收集的开始和结束。
要验证探针的可用性,请运行:
dtrace -P mono'$target' -l -c mono
PERMISSIONS
Mono 用于检测网络可达性的 Ping 实现可以创建 ICMP 数据包
本身不需要系统 ping 命令来完成这项工作。 如果你想启用
在 Linux 上,对于非 root 用户,您需要授予 Mono 二进制特殊权限。
以 root 身份运行以下命令:
# setcap cap_net_raw=+ep /usr/bin/mono
使用 onworks.net 服务在线使用单声道