visual studio rechazado página puerto para debug configurar conexión conectar con cambiar application debugging visual-c++ assembly 64bit alignment

debugging - rechazado - iis visual studio 2012



¿Cómo depurar accesos no alineados en amd64 usando Visual Studio? (3)

Me gustaría depurar y perfilar algún software de 64 bits que realice accesos no alineados, como en el siguiente ejemplo:

int foo[2] = { 1, 2 }; *((int *)((char *)foo + 2)) = 3;

La forma de gcc

Conozco dos maneras de hacerlo al usar gcc y gdb . El primero es habilitando el bit de verificación alineado (bit 18) en el registro eflags , directamente en mi código C o C ++:

asm volatile("pushf /n" "pop %%rax /n" "or $0x40000, %%rax /n" "push %%rax /n" "popf /n" ::: "rax");

Esto es muy útil porque puedo elegir dentro de la aplicación si omitir o no las comprobaciones de acceso no alineadas, por ejemplo cuando llamo a bibliotecas defectuosas conocidas.

La otra forma es de gdb , en cualquier momento mientras depura el ejecutable:

set $eflags |= 1<<18

Nuevamente, esto se puede activar o desactivar a voluntad, con guiones, etc. Muy útil.

Estudio visual

Ahora he sido totalmente incapaz de hacer lo mismo usando Visual Studio 2008 o 2010 en Vista64. El ensamblaje en línea en un programa C ++ ya no está disponible en el modo x64 en ninguna versión de Visual Studio, pero puedo usar intrinsics lugar:

#include <intrin.h> /* ... */ __writeeflags(__readeflags() | 0x40000);

Este es exactamente el mismo código que en Linux. Funciona de cierta manera : obtengo la excepción cuando se ejecuta mi código defectuoso. Excepto que el indicador EFL.AC se restablece a cero cada vez que se golpea un punto de interrupción. Lo que significa que no puedo depurar adecuadamente una aplicación grande con muchos puntos de interrupción complicados, a menos que tire el código con llamadas a mi función asm.

Así que traté de cambiar manualmente EFL |= 0x40000 desde la sesión de depuración de registro de Visual Studio (que es exactamente lo que suelo hacer en Linux). No hay efecto tampoco, el bit se establece en cero tan pronto como reanude la depuración. Lo que significa que no puedo depurar correctamente el código para el que no tengo el código fuente.

No entiendo lo que está pasando aquí. ¿Es Visual Studio configurando a la fuerza EFL.AC=0 ? Si es así, ¿puedo desactivar esa "función"? Además, ¿hay alguna manera de habilitar / deshabilitar EFL.AC durante una sesión de depuración?

¿Cómo pueden los desarrolladores reales de Windows rastrear accesos no alineados en su código?

Editar : descubrió __readeflags , que no estaba en la lista de intrínsecos x64 .


Lamentablemente, al depurar el depurador x64 en VS se borra el indicador de verificación de alineación en cualquier excepción (incluida la arrojada al paso al depurador en primer lugar). ¿Has intentado recorrer el código usando windbg (un depurador de Windows mucho más potente)? No he podido probarlo con la bandera de CA, pero debería ser simple con r efl = o directamente desde la ventana de registros. Si no tiene Windbg instalado, puede obtenerlo desde el SDK de Windows más reciente.


Una solución muy complicada es tener un hilo en su programa que establezca constantemente este bit. Cada 100 ms más o menos.

Entonces sabrá que poco después de reanudar desde su punto de interrupción, la alineación se comprobará nuevamente. No es 100% seguro, pero podría ser lo suficientemente bueno.