c++ portability debugbreak

c++ - ¿Hay un equivalente portátil para DebugBreak()/__ debugbreak?



portability (8)

¿Qué pasa con la definición de una macro condicional basada en #ifdef que se expande a diferentes construcciones basadas en la arquitectura o plataforma actual?

Algo como:

#ifdef _MSC_VER #define DEBUG_BREAK __debugbreak() #else ... #endif

El preprocesador expandiría la instrucción correcta de interrupción del depurador en función de la plataforma donde se compila el código. De esta forma siempre usas DEBUG_BREAK en tu código.

En MSVC , DebugBreak () o __debugbreak hacen que se rompa un depurador. En x86 es equivalente a escribir "_asm int 3", en x64 es algo diferente. Al compilar con gcc (o cualquier otro compilador estándar) también quiero hacer un corte en el depurador. ¿Existe una función independiente de la plataforma o intrínseca? Vi la pregunta de XCode sobre eso, pero no parece lo suficientemente portátil.

Nota: principalmente quiero implementar ASSERT con eso, y entiendo que puedo usar assert () para eso, pero también quiero escribir DEBUG_BREAK o algo en el código.


En lugar de utilizar las interrupciones de depuración "normales", ¿por qué no utilizar una de las siguientes, como una división por cero:

int iCrash = 13 / 0;

o desreferencia un puntero NULL:

BYTE bCrash = *(BYTE *)(NULL);

Al menos esto es portátil en muchas plataformas / arquitecturas.

En muchos depuradores puede especificar qué acción desea realizar en qué excepciones para que pueda actuar en consecuencia cuando se golpea una de las opciones anteriores (como la ejecución de pausa, como una instrucción "int 3") y se genera una excepción.


GCC tiene una función incorporada llamada __builtin_trap que puede ver aquí , sin embargo, se supone que la ejecución del código se detiene una vez que se alcanza.

debe asegurarse de que la llamada __builtin_trap() sea ​​condicional; de lo contrario, no se emitirá ningún código después de ella.

esta publicación fue impulsada por los 5 minutos de prueba, YMMV.


Si considera que assert (x) es lo suficientemente portátil, assert (false) parece ser la solución portátil obvia para su problema.


Un método que es portátil para la mayoría de los sistemas POSIX es:

raise(SIGTRAP);



Si intenta depurar una condición relacionada con un bloqueo, un buen aborto () a la antigua le dará una pila de llamadas en la mayoría de las plataformas. Lo malo es que no puede continuar desde la PC actual, que probablemente no quiera hacer de todos modos.

http://www.cplusplus.com/reference/cstdlib/abort/


#define __debugbreak() / do / { static bool b; / while (!b) / sleep(1); / b = false; / } while (false)

Cuando el proceso está durmiendo, puede adjuntar un depurador al proceso, cambiar la variable b para romper el ciclo y hacer lo suyo. ¡Este código podría no funcionar en una compilación optimizada!