큰 프로젝트에서 몇 달 동안 tcmalloc을 사용했으며 지금까지는 메모리 누출을 추적하고 제거 할 수있는 HeapProfiling 기능에 대해 매우 만족한다고 말해야합니다. 그들.tcmalloc에서 예기치 않은 동작이 발생했습니다.
지난 몇 주 동안 우리는 응용 프로그램에서 임의의 충돌을 경험했지만 무작위 충돌의 원인을 찾을 수 없었습니다. 매우 특별한 상황에서 응용 프로그램이 충돌했을 때 응용 프로그램 스레드 중 하나에 대해 완전히 손상된 스택을 발견했습니다. 여러 번 대신 스레드가 tcmalloc :: PageHeap :: AllocLarge()에 갇혀 있다는 것을 알았지 만, tcmalloc의 디버그 기호가 링크되어 있지 않아 문제가 무엇인지 이해할 수 없었습니다.
조사 일주일이 지난 오늘, 나는 가장 간단한 것을 시도해 보았습니다. 사용을 피하기 위해 연결에서 tcmalloc을 제거하여 무슨 일이 일어 났는지 보았습니다. 음 ... 드디어 문제가 무엇인지 발견하고, 문제가되는 코드는 다음과 매우 같습니다
void AllocatingFunction()
{
Object object_on_stack;
ProcessObject(&object_on_stack);
}
void ProcessObject(Object* object)
{
...
// Do Whatever
...
delete object;
}
응용 프로그램이 여전히 충돌하지만 결국 내가 있었다 개체에 대한 삭제를 호출 것을보고 libc의 사용 스택에 할당됩니다.
여전히 알아낼 수없는 것은 tcmalloc이 매우 위험한 (완전히 잘못된 것은 아니지만) 객체 할당 해제 및 AllocatingFunction이 끝날 때 object_on_stack이 범위를 벗어날 때의 이중 할당 해제와 상관없이 응용 프로그램을 계속 실행하는 이유입니다. 사실은 기분 나쁜 코드가 근본적인 가증함을 암시하지 않고 반복적으로 호출 될 수 있다는 것입니다.
나는 메모리 할당 해제가 제대로 사용되지 않을 때 "정의되지 않은 동작"중 하나라는 것을 알고 있지만 놀랍게도 "표준"libc와 tcmalloc 사이에는 이와 같은 다른 동작이 있습니다.
tcmalloc이 응용 프로그램을 계속 실행하는 이유에 대해 통찰력에 대한 설명이 있습니까? 사전 :
에서
덕분에
가
그들은 "정의되지 않은 동작"을 선택하여 * 크래시 *하지 않았습니다. 나는 이것에 의지 할 것이냐? * 지옥 안돼. – WhozCraig