2010-02-21 14 views
6

Escribí mi propio administrador de memoria contado de referencia C++ (por diversión) y estoy seguro de que no es perfecto;). Y ahora, cuando intento usarlo, obtengo señales SIGTRAP aleatorias. Si comento cada línea que está conectada con ese administrador de memoria todo funciona bien. Obtener SIGTRAP-s en lugar de SIGSEGV es bastante extraño. Sé que los SIGTRAP-s se lanzan cuando el programa llega a un punto de interrupción, pero no se establece ningún punto de interrupción. Leí en otro hilo que las compilaciones de depuración de los exe y dll deben estar actualizadas. Están actualizados y no es la razón.¿Obtener señales SIGTRAP aleatorias (en MinGW-gdb) es un signo de corrupción de memoria?

¿Alguien sabe por qué sucede esto?

+0

Dado que está en Windows, casi con seguridad * no * obtiene ningún SIGTRAP (que es un concepto de UNIX y no se aplica en absoluto a Windows). ¿Por qué no editas tu pregunta para describir lo que realmente observas? –

+7

Bien MinGW dice que SIGTRAP también está bajo Windows. – Calmarius

Respuesta

4

Después de buscar en Google me di cuenta de que esos sigtraps son los mismos que los de MSVC++ diciendo: "Windows ha desencadenado un punto de interrupción en xxxx.exe. Esto puede deberse a una corrupción del montón e indica un error blahblahblah " ...

Así que parece que sí, sigtraps inesperados pueden indicar corrupction memoria (bastante extraño ...)

y me encontré con mi error también. El MM está en una biblioteca estática que está vinculada a un dll. Y esa lib estática y el dll están vinculados a mi exe. Así que había dos administradores de memoria, uno en mi exe y otro en mi dll. Si llama al método de incialización del MM. Inicializó el MM en mi exe pero no en el dll así que el dll fue sin init. Lo solucioné al no vincular mi ejecutor con esa biblioteca estática.

2

Supongo que podría estar llamando a implementaciones nuevas/eliminadas o malloc/free no coincidentes - Así que el administrador de memoria asignó algo, pero cuando se libera la memoria se termina con la implementación de eliminación/libre predeterminada .

Establezca un punto de interrupción en la señal y compruebe si hay eliminación de operador() libre o en la pila y si esa es la implementación de dicha función que usted esperaría.

Cuestiones relacionadas