# 托管堆栈跟踪与 IL2CPP

> Configure IL2CPP compiler settings to produce more informative managed stack traces for easier debugging.

当托管代码中发生异常时，该异常的堆栈跟踪可以帮助您了解发生异常的原因。但是，在某些情况下，托管堆栈跟踪可能不会按预期显示。堆栈跟踪会根据构建配置而有所不同。

## C++ Compiler Configuration 选项

### Debug

当设置 [C++ Compiler Configuration](/engine/6000.0/script-reference/unity-editor/il-2-cpp-compiler-configuration.md) 属性来进行**调试**时，IL2CPP 会报告可靠的托管堆栈跟踪，并在调用堆栈中包含每个托管方法。该堆栈跟踪不包含原始 C# 源代码中的行号。

### Release 和 Master

将 [C++ Compiler Configuration](/engine/6000.0/script-reference/unity-editor/il-2-cpp-compiler-configuration.md) 属性设置为 **Release** 或 **Master** 设置时，IL2CPP 可能会生成缺少一个或多个托管方法的调用栈。当 C++ 编译器内联缺少的方法时，会发生这种情况。方法内联通常会改善运行时的性能，但可能会使调用堆栈更难理解。

IL2CPP 始终在调用堆栈上提供至少一个托管方法。对于由托管异常创建的堆栈跟踪，这是会导致异常发生的方法。调用堆栈上还包括其他未内联的方法。

## 源代码行号

要在托管堆栈跟踪中包含文件和行号信息，请选择**编辑** (Edit) > **项目设置** (Project Settings) > **播放器** (Player) > **其他设置** (Other Settings)。然后在**配置** (Configuration) 标题下，将 **IL2CPP Stacktrace Information** 属性设置为 **Method Name、File Name 和 Line Number** 设置。


**IL2CPP Stacktrace Information 属性设置为 Method Name、File Name 和 Line Number:**
![](/api/media?file=/engine/6000.0/media/images/IL2CPP-source-code-line-numbers.png)

此设置指示 IL2CPP 在调用堆栈中包含所有托管堆栈帧。只要有托管符号文件 (.pdb) 可用，并且此符号文件对应于包含该代码的托管程序集 (.dll)，每个堆栈帧就会包含正确的 C# 行号。

启用此功能后，会略微延长构建时间并增加构建程序的最终大小。播放器构建过程包括一个额外的步骤，用于处理调试符号文件并生成一个新的数据文件，其中包含必要的符号形式。Unity 随构建好的播放器一起提供此数据文件，并在运行时使用此数据文件来确定调用堆栈中的 C# 行信息。

启用此功能后，即使存在内联，Unity 也会在 **Release** 或 **Master** 配置中生成正确的调用堆栈。

## 启用脚本调试

要启用**脚本调试**，请选择**文件** (File) > **构建配置文件** (Build Profiles)，然后启用**脚本调试** (Script Debugging) 复选框。启用脚本调试后，IL2CPP 会报告正确的托管堆栈跟踪以及方法、文件和行号。这样做的代价是程序大小增大和性能下降。

如果只想改善堆栈跟踪，则不应启用脚本调试。请改用上述的[源代码行号](#source-code-line-numbers)。

## 其他资源

* [C++ Compiler Configuration](/engine/6000.0/script-reference/unity-editor/il-2-cpp-compiler-configuration.md)
