visual-studio debugging winapi

Cómo ejecutar GetLastError() al depurar en Visual Studio



visual-studio debugging (3)

"editar y continuar" agregue el código para que pueda ver el error (simplemente no cree una nueva variable global para almacenarlo). Funciona muy bien si puede poner rápidamente una llamada a una función preexistente que ejecuta este tipo de código de manejo de errores.

Como beneficio adicional, puedes dejar el nuevo código allí para el futuro también.

Si no puede hacer esto, entonces QBziZ tiene razón: "ERR, hr" lo hace.

Está pasando por el código C / C ++ y acaba de llamar a una API de Win32 que ha fallado (normalmente devolviendo un código de error genérico poco útil, como 0). Su código no realiza una llamada GetLastError () posterior cuyo valor de retorno podría inspeccionar para obtener más información sobre errores.

¿Cómo puede obtener el valor del error sin recompilar y reproducir el error? Entrar en "GetLastError ()" en la ventana de vigilancia no funciona ("error de sintaxis").


ERR,hr en una ventana de observación por lo general hace el truco


Como se mencionó un par de veces, el pseudo-registro @err mostrará el último valor de error, y @err,hr mostrará el error como una cadena (si puede).

De acuerdo con Andy Pennell, un miembro del equipo de Visual Studio, comenzando con VS 7 (Visual Studio .NET 2002), el uso del carácter ''@'' para indicar pseudoregistros está obsoleto: prefieren usar ''$'' (como en $err,hr ). Tanto $ como @ son compatibles por el momento.

También puede usar el pseudoregistro $ err en un punto de interrupción condicional; para que pueda romper una línea de código solo si el último error es distinto de cero. Esto puede ser un truco muy útil.

Algunos otros pseudoregistros que puede encontrar útiles (del excelente libro de John Robbins, "Aplicaciones de depuración para Microsoft .NET y Microsoft Windows" ):

  • $tib - muestra el bloque de información del hilo
  • $clk : muestra un conteo de reloj (útil para las funciones de tiempo). Para usarlo más fácilmente, coloque un reloj $clk luego un reloj $clk=0 adicional. El segundo reloj borrará el pseudoregistro después de que se muestre el valor actual, por lo que el siguiente paso o paso más le dará el tiempo para esa acción solamente. Tenga en cuenta que este es un momento aproximado que incluye un poco de sobrecarga del depurador, pero aún puede ser muy útil.