c++ debugging stack-trace stack-dump

c++ - ¿Cómo puedo interpretar un archivo.stackdump?



debugging stack-trace (3)

esta pregunta es probablemente una repetición de Usar un stackdump desde el ejecutable de Cygwin , pero soy un principiante y no entendí las respuestas, ni siquiera partes de la pregunta.

Soy bastante nuevo en c ++ y programación y estoy desarrollando en NetBeans. Estoy trabajando en un código que se compila bien, pero falla mientras se ejecuta. Si uso el depurador obtengo el siguiente error:

1 [main] all 6200 exception::handle: Exception: STATUS_ACCESS_VIOLATION 881 [main] all 6200 open_stackdumpfile: Dumping stack trace to all.exe.stackdump

Me las arreglé para encontrar el archivo all.exe.stackdump, y puedo leerlo a través de notepad ++, pero no entiendo lo que significa. Por la otra pregunta, me doy cuenta de que hay una forma fácil de decodificar este archivo, pero mi mejor suposición es que bash$ gdb all.exe.stackdump fue efectivo. ¿Cuál es la mejor manera para que yo use este archivo en la depuración?

En caso de que sea útil, aquí está el contenido de all.exe.stackdump

Exception: STATUS_ACCESS_VIOLATION at eip=00434C41 eax=2003A2E4 ebx=0028A95C ecx=00000000 edx=0028A95C esi=0028A9B0 edi=00000000 ebp=0028A9C8 esp=0028A930 program=[redacted for privacy/security], pid 6200, thread main cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B Stack trace: Frame Function Args 0028A9C8 00434C41 (00000000, 2003A4F0, 0028A9E8, 00000000) 0028A9E8 00436B14 (00000000, 2003A4F0, 0028AA28, 0028D000) 0028AAF8 004036A4 (0028AB80, 2003A2B0, 00000014, 00000003) 0028ABD8 00403FBC (00000001, 0028AC00, 200280E8, 2003A189) 0028ACF8 61007535 (00000000, 0028CD78, 61006B20, 00000000) End of stack trace


Este es un problema común para muchos chicos; y usualmente te dirán que uses gdb. Sin embargo, esta no es siempre una respuesta razonable. No debe volver a compilarlo, ya que no se garantiza que la nueva compilación tenga las mismas direcciones de símbolos que la que se estrelló. Hay varias herramientas que podrían ser útiles: objdump, addr2line, etc. Puede hacer "objdump -D -S build.out> build.rasm.txt", y luego buscar esas direcciones de funciones entre el texto. Addr2line también es una buena opción para identificar esas funciones. Si va a manejar este tipo de problemas con frecuencia, se recomienda escribir una herramienta de script para ayudarlo en su trabajo.

Buena suerte.


Otra forma de encontrar la línea problemática sería usar gdb en su archivo binario. Así que ejecuta gdb primero: gdb main.exe

Inside gdb run: info line *0xADD4355


Puede utilizar las direcciones de "Función" como argumentos para addr2line .

addr2line -f -C -e main.exe 0xADD4355

Filtrarlo usando awk y pipe en todas las direcciones:

awk ''/^[0-9]/{print $2}'' main.exe.stackdump | addr2line -f -C -e main.exe

Si ves ?? ''s en lugar de nombres de funciones, deberá reconstruir con símbolos de depuración ( -g , -ggdb3 , ... )