在 xcode 的调试器中查看 IL2CPP 的 string_t 的内容
Viewing contents of IL2CPP's string_t in xcode's debugger
Unity 的 IL2CPP/LLVM 后端从 C# 生成 cpp 文件。您当然可以读取这些文件,并将断点放入其中以查看变量。然而,C# 字符串被转译为一个名为 String_t 的自定义 class。 Xcode 似乎不知道如何打印这些 classes 的内部字符串,我不确定如何读取原始字节。
这是 String_t 的定义:
struct String_t : public Object_t
{
// System.Int32 System.String::length
int32_t ___length;
// System.Char System.String::start_char
uint16_t ___start_char;
};
...谁能弄清楚如何从 Xcode 断点读取包含的字符串?
在localswindow和selectView Memory of "*foo"
中右击字符串可以看到内存中的字符串。然后字符串从 12 个字节开始。由于 IL2CPP 的 16 位字符,字符串之间用点打印。这可能不适用于 unicode 字符!
如果有人有更强大的解决方案,我很乐意接受他们的回答。
您可以使用 p il2cpp::utils::StringUtils::Utf16ToUtf8
。所以如果变量的名称是 L_3
例如,那么你可以这样做:
p il2cpp::utils::StringUtils::Utf16ToUtf8(&L_3->___start_char_1)
Unity 的 IL2CPP/LLVM 后端从 C# 生成 cpp 文件。您当然可以读取这些文件,并将断点放入其中以查看变量。然而,C# 字符串被转译为一个名为 String_t 的自定义 class。 Xcode 似乎不知道如何打印这些 classes 的内部字符串,我不确定如何读取原始字节。
这是 String_t 的定义:
struct String_t : public Object_t
{
// System.Int32 System.String::length
int32_t ___length;
// System.Char System.String::start_char
uint16_t ___start_char;
};
...谁能弄清楚如何从 Xcode 断点读取包含的字符串?
在localswindow和selectView Memory of "*foo"
中右击字符串可以看到内存中的字符串。然后字符串从 12 个字节开始。由于 IL2CPP 的 16 位字符,字符串之间用点打印。这可能不适用于 unicode 字符!
如果有人有更强大的解决方案,我很乐意接受他们的回答。
您可以使用 p il2cpp::utils::StringUtils::Utf16ToUtf8
。所以如果变量的名称是 L_3
例如,那么你可以这样做:
p il2cpp::utils::StringUtils::Utf16ToUtf8(&L_3->___start_char_1)