¿Cómo diagnosticar un problema mediante un volcado de núcleo?

¿Cómo diagnosticar un problema mediante un volcado de núcleo?

Tengo el siguiente volcado de memoria:

pth_signal.pthread_kill(??, ??) at 0xd0124734
pth_signal._p_raise(??) at 0xd01241a4
raise.raise(??) at 0xd038acd0
abort.abort() at 0xd03eeb78
_ZN10__cxxabiv111__terminateEPFvvE(handler = ??), line 47 in "eh_terminate.cc"
_ZSt9terminatev(), line 57 in "eh_terminate.cc"
__cxa_throw(obj = ??, tinfo = ??, dest = ??), line 77 in "eh_throw.cc"
unnamed block in _Znwm(sz = 4048060128), line 54 in "new_op.cc"
unnamed block in _Znwm(sz = 4048060128), line 54 in "new_op.cc"
unnamed block in _Znwm(sz = 4048060128), line 54 in "new_op.cc"
_Znwm(sz = 4048060128), line 54 in "new_op.cc"
_Znam(sz = ??), line 36 in "new_opv.cc"
_ZN7PROFILEC1ERK6STRING(this = @0x2fe74398, iniFilename = @0x21973300), line 99 in "profile.cpp"
_ZN2IE17AppendToBDataListEP10BASKETDATA(this = @0x2130eb38, bd = 0x2fe7f000), line 2451 in "ie.cpp"
_ZN5DIEGO14HandleResponseEP10BASKETDATAPv(this = 0x2130eb38, bd = 0x2fe7f000, args = 0x2fe71d78), line 513 in "diegoclass.cpp"
_ZThn68_N5DIEGO14HandleResponseEP10BASKETDATAPv(0x2130eb7c, 0x2fe7f000, 0x2fe71d78), line 21 in "diegoclass.h"
_ZN8KOBJBASE8dispatchEiP10BASKETDATAPv(this = 0x2130eb7c, fcnidx = 12, bd = 0x2fe7f000, args = 0x2fe71d78), line 67 in "kobjbase.cpp"
_ZN6KERNEL8DispatchEPcS0_iP10BASKETDATAPvR4LISTI8KOBJBASEE(this = @0x2fe71d38, module = "diego", method = "HandleResponse", fcn_idx = 12, bd = 0x2fe7f000, args = 0x2fe71d78, thread_objects = @0xf156dd58), line 1118 in "skernel.cpp"
unnamed block in _ZN6KERNEL9ExecuteTXEP10BASKETDATA(this = @0x2fe71d38, bd = 0x2fe7f000), line 224 in "txthread.cpp"
unnamed block in _ZN6KERNEL9ExecuteTXEP10BASKETDATA(this = @0x2fe71d38, bd = 0x2fe7f000), line 224 in "txthread.cpp"
_ZN6KERNEL9ExecuteTXEP10BASKETDATA(this = @0x2fe71d38, bd = 0x2fe7f000), line 224 in "txthread.cpp"
unnamed block in _ZN6KERNEL22ProcessEnqueuedBasketsEP6BASKET(this = @0x2fe71d38, b = @0x2fe7ef68), line 1162 in "skernel.cpp"

¿Cómo puedo utilizar el volcado de memoria para solucionar el problema que tengo?

Respuesta1

Primero, ejecuta esa salida a través de c++filt, que convierte los símbolos de C++ en una salida legible por humanos y con capacidad de referencia cruzada del código fuente.

A partir de eso, se ve que el constructor PROFILE ha llamado, new[]lo que ha provocado que se genere una excepción para la cual no hay un controlador (se llama a std::terminate), lo que hace que el programa aborte, generando un volcado de núcleo.

Puede encapsular la llamada new[]en un try...catchbloque para ver cuál es la excepción. No puedo recordar qué excepciones new[]pueden surgir y bajo qué circunstancias, pero una causa de newfallas es un montón corrupto, comúnmente por sobrescribir los límites de una asignación o un doble delete.

Puede diagnosticar estos errores de memoria utilizando programas como valgrind(gratuito) o purify(comercial, suponiendo que todavía exista; lo usé por última vez hace 15 años). valgrindSería un buen comienzo y le mostrará los errores de memoria del formulario mencionado anteriormente.

Puede profundizar más con el volcado de núcleo para gdbinspeccionar la imagen de memoria de su programa en el momento en que falló, pero nadie aquí puede ayudar realmente con eso; necesita conocer la estructura de su código y el diseño de memoria esperado para hacerlo. mucho con esto.

información relacionada