Acabo de pasar algún tiempo persiguiendo un error que se reduce a lo siguiente. El código sobrescribió erróneamente la pila, y creo que se escribió sobre la dirección de retorno de la llamada a la función. Después de la devolución, el programa fallaría y la pila estaría dañada. Al ejecutar el programa en valgrind devolvería un error como:Cómo depurar errores de sobreescritura de la pila con Valgrind?
vex x86->IR: unhandled instruction bytes: 0xEA 0x3 0x0 0x0
==9222== valgrind: Unrecognised instruction at address 0x4e925a8.
Calculo que esto es debido a que el rendimiento subió a un lugar al azar, que contiene cosas que no eran válidos los códigos de operación x86. (Aunque yo soy de alguna manera sospechoso que esta dirección 0x4e925a8 se encontraba en una página ejecutable. Imagino valgrind arrojaría un error diferente si este no era el caso.)
Estoy seguro de que el problema era de la stack- sobreescribiendo el tipo, y desde entonces lo he arreglado. Ahora estoy tratando de pensar cómo podría detectar errores como este de manera más efectiva. Obviamente, valgrind no puede advertirme si reescribo los datos en la pila, pero tal vez pueda detectarse cuando alguien escribe sobre una dirección de retorno en la pila. En principio, puede detectar cuándo algo como 'push EIP' ocurre (para que pueda indicar dónde están las direcciones de retorno en la pila).
Me preguntaba si alguien sabe si Valgrind, o cualquier otra cosa puede hacer eso? De lo contrario, puede comentar otras sugerencias sobre errores de depuración de este tipo de manera eficiente.
Le recomiendo que presente un error de lista de deseos contra valgrind. –
La dirección de retorno no se presiona con la instrucción 'push', sino implícitamente con la instrucción' call'. Lo que hace que sea más fácil detectar dónde está. –
@ Jan Hudec, eso sería una buena característica en Valgrind, ¿no? Sí, tiene razón en que 'call' empuja la dirección de retorno, la escribí de esta manera solo para ser completamente clara. – Max