Como diagnosticar um problema usando um core dump?

Como diagnosticar um problema usando um core dump?

Eu tenho o seguinte dump principal:

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"

Como posso usar o core dump para corrigir a falha que estou tendo?

Responder1

Primeiro, você executa essa saída por meio de c++filt, que desmonta os símbolos C++ em uma saída legível por humanos e com capacidade de referência cruzada de código-fonte.

A partir disso, você vê que o construtor PROFILE foi chamado, new[]o que causou o surgimento de uma exceção para a qual não há manipulador (std::terminate é chamado), o que faz com que o programa seja abortado, gerando um core dump.

Você pode agrupar a chamada new[]em um try...catchbloco para ver qual é a exceção. Não consigo lembrar de cara quais exceções new[]podem surgir e em que circunstâncias, mas uma das causas das newfalhas é um heap corrompido, geralmente por sobrescrever os limites de uma alocação ou de um double delete.

Você pode diagnosticar esses erros de memória usando programas como valgrind(gratuito) ou purify(comercial, supondo que ainda exista - usei-o pela última vez há 15 anos). valgrindseria um bom começo e mostrará seus erros de memória no formato mencionado acima.

Você pode se aprofundar no core dump gdbpara inspecionar a imagem de memória do seu programa no momento em que ele travou, mas ninguém aqui pode realmente ajudar com isso - você precisa conhecer a estrutura do seu código e o layout de memória esperado para fazer muito com isso.

informação relacionada