En la programación en modo de 32 bits solía emplear int 3
en mis programas para detenerme en una ubicación determinada con el depurador (incrustando la instrucción en la fuente). Ahora en 64 bits parece no estar funcionando, produciendo un SIGSEGV muy ordinario bajo gdb y destruyendo el programa más allá de la esperanza ("Programa terminado con señal SIGSEGV, falla de segmentación. El programa ya no existe"). Me pregunto si el modo de 64 bits tiene otro mecanismo, o si debería hacer un cache-flush (el int 3
es un código de operación generado dinámicamente en este caso (0xcc), es un código similar a un jit).¿Por qué int 3 genera un SIGSEGV en 64 bits en lugar de detener el depurador?
Respuesta
La respuesta de BarsMonster muestra que __asm__("int3");
no funcionará en plataformas de 64 bits. Esto es, al menos hoy (2014), no es cierto.
El siguiente código trabajará en una plataforma amd64
:
punto de interrupción.c
int main() {
int i;
for(i=0; i<3;i++) {
__asm__("int3");
}
}
compilarlo trivialmente: gcc -c breakpoint.c
y empezar gdb a.out
:
(gdb) run
Starting program: /tmp/a.out
Program received signal SIGTRAP, Trace/breakpoint trap.
0x00000000004004fb in main()
Ves, GDB se detiene en el punto de interrupción.
Debería decir la versión del kernel en lugar de la fecha :-) –
@CiroSantilli 视 事件 视 视 视 视 Buen punto. Lamentablemente, no puedo decir nada más. Lo único que seguramente sé es que era un núcleo 3.x.y. Mi kernel actual es 3.19.0 y todavía funciona. – hek2mgl
__debugbreak()
Hoy en día un colega vino a preguntar acerca de cómo conseguir "int 3" funcionalidad en las plataformas de 64 bits. ¿Qué es "int 3"? Es la instrucción de ensamblaje que es que se usa para crear un punto de interrupción. Al menos que es la instrucción para el procesador x86 , y como se puede imaginar, es muy específico de la plataforma.
En las plataformas de 64 bits no hay ensamblado en línea , así que ahí va su "__asm int 3". ¿Qué hacer ahora? Bueno, hay una construcción menos conocida que es mucho mejor para usar en ese funciona en todas las plataformas (x64, Itanium y x86), que es __debugbreak(). Este es un compilador de Visual C++ intrínseco (definido en Visual C++ 2005 en vc \ include \ intrin.h, con toneladas de otros intrínsecos geniales) que actuará efectivamente como "int 3" en todas las plataformas.
DebugBreak, la llamada a la función Win32 es todavía alrededor, pero en general el uso de __debugbreak() es mi preferencia, si no por otra razón que no es una llamada función (que es un compilador intrínseca), y don No es necesario depurar los símbolos para obtener una pila de llamadas legible.
Si estás escribiendo C++ es probable que no desea escribir no portátil ensamblaje , y esto es sólo uno menos lugar donde tendría que.
http://blogs.msdn.com/b/kangsu/archive/2005/09/07/462232.aspx
Esta es una respuesta muy informativa, pero como especifiqué en mi pregunta, estaba generando código dinámicamente, y eso excluye los intrínsecos del compilador. Sin mencionar que mi compilador habitual no es Visual C++, ni mi plataforma Windows. Además, la respuesta es inexacta porque int 3 existe y al menos en 64 bits, Linux se comporta como siempre. Además, dependiendo del compilador, tiene ensamblado en línea en el modo de 64 bits. – dsign
solo funciona en x86? – Damian
Eso está bien para MS IDEs, pero ¿qué sucede si uso Eclipse y GCC? – Mawg
Ahh, lo tengo, lo siento. Tuve que desproteger las páginas para su ejecución. Int 3 sigue siendo una trampa de depuración válida.
Detalles? A las mentes inquisitivas les gustaría saber. – BeeOnRope
Esta pregunta fue hace siete años, por lo que es difícil recordar los detalles de lo que hice. Recuerdo que fue bastante sencillo, creo que estaba llamando a mmap (2) y acabo de agregar la bandera PROT_EXEC. ¿O era mprotect (2) ...? – dsign
Es de suponer que la ejecución nunca llegó al 'int3' porque el código estaba en una página de lectura/escritura/no ejecución. Así que simplemente saltar allí provocó una segfault, independientemente de los contenidos. Y sí, 'PROT_READ | PROT_EXEC | PROT_WRITE' para mmap debería ser el enfoque correcto. O bien, podría comenzar con una página de lectura/escritura, luego voltearla para leer/exec con mprotect una vez que haya terminado, para que nunca tenga asignada una página de escritura + ejecutor (por razones de seguridad). –
Te recomiendo que nunca uses asm int 3
ya que funciona para todos los tipos de compilación. Es posible que olvide una línea en algún lugar de su código y eso puede significar grandes problemas. La alternativa es usar __debugbreak, que solo es válido en el modo de depuración.
- 1. ¿Por qué el PrintDialog no se muestra (en 64 bits)?
- 2. ¿Por qué __sync_add_and_fetch funciona para una variable de 64 bits en un sistema de 32 bits?
- 3. ¿Detener en depurador en Chrome?
- 4. 64 bits por división de 32 bits
- 5. ¿Aplicación de 32 bits o de 64 bits en el sistema operativo de 64 bits?
- 6. ¿Por qué debería usar el JDK de 64 bits en la versión de 32 bits?
- 7. ¿Por qué debería bloquearse el depurador VS2010?
- 8. ¿Cómo iniciar depurador automáticamente para depurar aplicaciones de 32 bits en Windows 7 de 64 bits?
- 9. ¿Qué es el tipo "int" compatible en las ventanas de 32 bits y 64 bits en C++?
- 10. NCover en el sistema de 64 bits
- 11. ¿Cómo implementar un int sin firmar de 64 bits en Java utilizando la clase BigInteger?
- 12. ¿Por qué el depurador C# de Visual Studio 2010 continúa en lugar de pasar por alto?
- 13. ¿Por qué una int en OCaml solo tiene 31 bits?
- 14. En C#, ¿por qué "int" es un alias para System.Int32?
- 15. A veces, la reducción de un mapa de bits genera un archivo más grande. ¿Por qué?
- 16. ¿Cómo evitar problemas con los tipos size_t e int en compilaciones de 64 bits en C++?
- 17. Aplicaciones Java de 64 bits: ¿Se requiere un SO de 64 bits, un JRE de 64 bits y una Aplicación de 64 bits?
- 18. ¿Ventajas/inconvenientes de ejecutar JVM de 64 bits en un servidor Linux de 64 bits?
- 19. SendInput falla en 64 bits
- 20. ¿Por qué ir al sistema operativo de 64 bits?
- 21. Tipo (3,) devuelve un número entero en lugar de una tupla en Python, ¿por qué?
- 22. ¿Cómo compilar un programa C++ como de 64 bits en una máquina de 64 bits?
- 23. Ejecute AnyCPU como 32 bits en sistemas de 64 bits
- 24. alineación uint32_t en 64 bits?
- 25. ¿Por qué la fragmentación de memoria es un problema en una máquina de 64 bits?
- 26. ¿Por qué se ignora el manifiesto de mi aplicación VB6 en máquinas de 64 bits?
- 27. Computing alto 64 bits de un producto int 64x64 en C
- 28. Representando un entero de 64 bits en GNU/Linux
- 29. Boost.Test en Windows de 64 bits
- 30. ¿Por qué la MSBuild de 64 bits carga extensiones de 32 bits?
¿Qué sistema operativo/versión? –