# 调试生成的 C++ 代码

> Understand how to use Visual Studio to debug your generated C++ code.

您可以使用 Visual Studio 调试为通用 Windows 平台 (UWP) 应用程序生成的 C++ 代码。

## 了解所生成 C++ 代码中类和方法的命名##understand-class-and-method-naming-in-generated-c++-code

### IL2CPP 类##il2cpp-classes

IL2CPP 类遵循 `<ClassName>_t#number` 的格式，其中：

* `<ClassName>` 是类的名称
* 可选 `#number` 是唯一的类型编号

IL2CPP 类示例：

* `String_t` - [String 类](https://learn.microsoft.com/en-us/dotnet/api/system.string)
* `Object_t` - [Object 类](https://learn.microsoft.com/en-us/dotnet/api/system.object)
* `Type_t` - [Type 类](https://learn.microsoft.com/en-us/dotnet/api/system.type)
* `StringBuilder_t26` - [StringBuilder 类](https://learn.microsoft.com/en-us/dotnet/api/system.text.stringbuilder)

### IL2CPP 方法##il2cpp-methods

IL2CPP 方法遵循 `<ClassName>_<MethodName>_m#number` 的格式，其中：

* `<ClassName>` 是方法的声明类型的类名称
* `<MethodName>` 是方法名称
* `#number` 是唯一的方法编号

IL2CPP 方法示例：

* `ConfigurationSection_DoDeserializeSection_m1275` - [ConfigurationSection 类的 DeserializationSection 方法](https://learn.microsoft.com/en-us/dotnet/api/system.configuration.configurationsection.deserializesection)
* `String_Format_m4102` - [String 类的格式方法](https://learn.microsoft.com/en-us/dotnet/api/system.string.format)
* `Mathf_Sqrt_m289` - [Mathf 类的 Sqrt 方法](https://learn.microsoft.com/en-us/dotnet/api/system.mathf.sqrt)

### IL2CPP 静态字段结构##il2cpp-static-field-structures

静态字段结构遵循 `<ClassName>_t#number_StaticFields` 的格式，其中结构名称的第一部分与声明类型相同。

静态字段结构示例：

* `StringBuilder_t26_StaticFields`
* `Thing_t24_StaticFields`

### C++ 注释##c++-comments

在每个类或方法定义之前，C++ 会自动生成注释，说明完整的类或方法名称。

C++ 注释示例：

```
    // System.Text.StringBuilder
    struct StringBuilder_t26  : public Object_t
    {
        // System.Int32 System.Text.StringBuilder::_length
        int32_t length_1;
        // System.Int32 System.Text.StringBuilder::_maxCapacity
        int32_t maxCapacity_2;
    };
```

## 观察变量值##observe-variable-values

您可以通过[使用 Visual Studio 调试器](https://learn.microsoft.com/en-us/visualstudio/gamedev/unity/get-started/using-visual-studio-tools-for-unity?pivots=windows#unity-debugging)观察变量的值来调试所生成的 C++ 代码。

您可以[在 Visual Studio 中设置断点](/engine/6000.0/manual/scripting/debugging-and-diagnostics/managed-code-debugging.md#BreakpointsVS)，即您希望调试器停止的位置，以便能够观察变量。Visual Studio 允许您通过将鼠标悬停在变量上或[使用观察 (Watch) 窗口](https://learn.microsoft.com/en-us/visualstudio/debugger/watch-and-quickwatch-windows?)来观察变量值。

## 观察静态字段##observe-a-static-field

在 IL2CPP 中，Unity 将静态字段存储在 Il2CppClass 实例中。要观察静态字段的值，您需要：

1. 在代码中查找指向该类型 Il2CppClass 结构的[指针](https://learn.microsoft.com/en-us/cpp/cpp/pointers-cpp)。

   \*\*注意：\*\*这些指针位于使用它们的方法的作用域内，但在观察一次之后，指针将在应用程序运行期间保持在相同的内存地址。
2. 从该指针检索 `static_fields` 字段的值。这是一个指针，指向包含该特定类型的静态字段的内存块。
3. 将该值转换为相应的静态字段结构。
4. 观察 [Visual Studio 调试器](https://learn.microsoft.com/en-us/visualstudio/gamedev/unity/get-started/using-visual-studio-tools-for-unity?pivots=windows#unity-debugging)中的值。

## 调查异常##investigate-exceptions

IL2CPP 使用本机 C++ 异常来实现 .NET 异常。

要调查代码中的异常，您可以：

* 在[观察 (Watch) 窗口](https://learn.microsoft.com/en-us/visualstudio/debugger/watch-and-quickwatch-windows?)中检查异常对象
* [启用调试器中断](https://learn.microsoft.com/en-us/visualstudio/debugger/managing-exceptions-with-the-debugger) C++ 异常

## 其他资源##additional-resources

* [关于如何使用 Visual Studio 调试 C++ 代码的 Microsoft 文档](https://learn.microsoft.com/en-us/visualstudio/debugger/getting-started-with-the-debugger-cpp?)
* [关于 Unity 使用 Visual Studio 进行调试的 Microsoft 文档](https://learn.microsoft.com/en-us/visualstudio/gamedev/unity/get-started/using-visual-studio-tools-for-unity?pivots=windows#unity-debugging)
* [IL2CPP 概述](/engine/6000.0/manual/scripting/compilation-and-code-reload/backends/il2cpp.md)
* [UWP 的 IL2CPP 脚本后端](/engine/6000.0/manual/platform-specific/windows-store/uwp-developing/uwp-il2cpp-scripting.md)
