다음과 같은 코어 덤프가 있습니다.
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"
발생한 충돌을 해결하기 위해 코어 덤프를 어떻게 사용할 수 있습니까?
답변1
c++filt
먼저 C++ 기호를 사람이 읽을 수 있고 소스 코드 상호 참조가 가능한 출력으로 변환하는 를 통해 해당 출력을 실행합니다 .
여기에서 PROFILE 생성자가 호출되어 new[]
처리기가 없는 예외가 발생하여(std::terminate가 호출됨) 프로그램이 중단되고 코어 덤프가 생성되는 것을 볼 수 있습니다.
호출을 블록 new[]
으로 래핑하여 try...catch
예외가 무엇인지 확인할 수 있습니다. new[]
어떤 상황에서 어떤 예외가 발생할 수 있는지 머리로는 기억나지 않지만 , new
실패의 원인 중 하나는 일반적으로 할당 범위나 double 의 경계를 덮어쓰는 데서 발생하는 손상된 힙입니다 delete
.
valgrind
(무료) 또는 purify
(상업용, 아직 존재한다고 가정 - 15년 전에 마지막으로 사용함) 과 같은 프로그램을 사용하여 이러한 메모리 오류를 진단할 수 있습니다 . valgrind
좋은 시작이 될 것이며 위에서 언급한 형태의 메모리 오류를 보여줄 것입니다.
gdb
프로그램이 충돌했을 때 프로그램의 메모리 이미지를 검사하는 데 사용하는 코어 덤프를 사용하여 더 깊이 들어갈 수 있지만 여기에 있는 누구도 실제로 도움을 줄 수 없습니다. 코드 구조와 수행할 예상 메모리 레이아웃을 알아야 합니다. 이것으로 많이.