Unity proporciona algunas facilidades para facilitar la depuración en Windows para la depuración forense o en vivo de los procesos de juego o editor.
En primer lugar, la claridad en relación con la depuración. Hay dos tipos de depuración que necesitan ser tratados en Unity. Está la depuración de C++ nativa, así como la depuración manejada C#. Para las plataformas que soportan IL2CPP, habrá sólo depuración nativa, pero la depuración manejada permanecerá para el editor con fines de iteración rápida.
La depuración Nativa se facilita por tener símbolos (archivos pdb) para los archivos binarios asociados (exe o dll).
En Windows, los símbolos manejados .NET estándar son almacenados en archivos pdb también, sin embargo cuando se utilice mono, hay archivos mdb.
Unity proporciona una tienda de símbolos en http://symbolserver.unity3d.com/ . Este URL del servidor se puede utilizar en windbg o VS2012 y posterior para una resolución de símbolos automática y de descarga (como la tienda de símbolos de Microsoft).
La manera más fácil de agregar una tienda de símbolos en windbg es el comando .sympath.
.sympath+ SRV*c:\symbols-cache*http://symbolserver.unity3d.com/
Descompongamos esto:
.sympath+
La adición +, deja la ruta de símbolo existente sola y agrega esta búsqueda de almacén de símbolos
SRV*c:\symbols-cache
The SRV indicates a remote server to fetch from, while the c:\symbols is a local path to cache the downloaded symbols and to look there first before downloading again.
*http://symbolserver.unity3d.com/
La ruta de acceso a la tienda de símbolos para buscar desde
Note: VS2010 and earlier do not function with http server symbol stores.
1. Vaya a Tools -> Options
2. Expanda la sección de depuración, seleccione Symbols
3. Especifique un directorio de caché (si todavía no se ha especificado)
4. Agregue un “Symbol file (.pdb) location” of http://symbolserver.unity3d.com/
La depuración en vivo es el escenario de adjuntar un depurador a un proceso que se está ejecutando normalmente, o a un proceso dónde una excepción que ha sido atrapada. Con el fin de que el depurador sepa lo que está sucediendo, los símbolos necesitan ser incluidos en la construcción. Eso es lo que los pasos anteriores deben abordar. Una cosa adicional a saber es que el ejecutable del juego se nombra según su nombre del juego, así que el depurador puede tener problemas encontrando el pdb correcto si no tiene acceso a su ejecutable renombrado.
En Windows, Microsoft instala automáticamente en fallos de aplicación para ir al Dr. Watson / Informe de errores a Microsoft. Sin embargo, si tiene instalado Visual Studio o windbg, Microsoft proporciona una facilidad a los desarrolladores expertos para optar por debug the crashes. Para facilitar la instalación, aquí está un archivo de registro de contenidos para instalar:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug]
"Auto"="1"
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug]
"Auto"="1"
Un poco extra para la depuración del editor:
Unity.exe -dbgbreak
Lanzará Unity e inmediatamente ofrecerá un depurador para conectarse si se configura el manejo automático de fallos
Windows proporciona instalaciones para investigar archivos de dump de fallos (.dmp o .mdmp). Dependiendo del tipo de dump de fallo, simplemente puede haber información de la pila o quizás toda la memoria del proceso. Dependiendo del contenido, existen varias posibilidades de ver lo que pudo haber ocurrido para provocar un choque. En el caso habitual, a menudo tienes al menos una pila para investigar (si es una pila válida …)
Para investigar un archivo de volcado, sus opciones se cargan a través de Visual Studio o windbg. Mientras Visual Studio es una herramienta más amigable para usar, su poder es un poco más limitado que windbg.
Una NullReferenceException a menudo se verá así:
1b45558c()
> mono.dll!malloc(unsigned int size=12) Line 163 + 0x5f bytes C
mono.dll!g_hash_table_insert_replace(_GHashTable * hash=0x065c3960, void * key=0x0018cba4, void * value=0x0018cb8c, int replace=457528232) Line 204 + 0x7 bytes C
mono.dll!mono_jit_runtime_invoke(_MonoMethod * method=0x242bf8b0, void * obj=0x065c3960, void ** params=0x0018cba4, MonoObject * * exc=0x0018cb8c) Line 4889 + 0xc bytes C
Este no es un fallo en malloc, ni en mono - es una NullReferenceException que es: * Atrapada por el depurador de VS * No controlado en el reproductor de un usuario, haciendo que el reproductor salga
Con el ejemplo previo nuevamente:
1b45558c()
> mono.dll!malloc(unsigned int size=12) Line 163 + 0x5f bytes C
mono.dll!g_hash_table_insert_replace(_GHashTable * hash=0x065c3960, void * key=0x0018cba4, void * value=0x0018cb8c, int replace=457528232) Line 204 + 0x7 bytes C
mono.dll!mono_jit_runtime_invoke(_MonoMethod * method=0x242bf8b0, void * obj=0x065c3960, void ** params=0x0018cba4, MonoObject * * exc=0x0018cb8c) Line 4889 + 0xc bytes C
Las líneas sin ninguna información son frames manejados. Hay, sin embargo, una manera de obtener la información de la pila administrada: mono tiene una función incorporada llamada mono_pmip, que acepta la dirección de un marco de pila y devuelve un char * con información. Puede invocar mono_pmip en la ventana inmediata de Visual Studio:
?(char*)mono.dll!mono_pmip((void*)0x1b45558c)
0x26a296c0 “ Tiles:OnPostRender () + 0x1e4 (1B4553A8 1B4555DC) [065C6BD0 - Unity Child Domain]”`
Note: This only works where mono.dll symbols are properly loaded.
Sometimes there are cases where the application doesn’t crash with the debugger attached, or an application crashes on a remote device where the debugger is not available. However, you can still get useful information if you can get the dump file - follow the below steps in order to do so.
Note: These instructions are for Windows Standalone and Universal Windows Platform (when running on desktop).
• 2017–05–16 Page amended with no editorial review