가볍게 넣으려면 작은 메모리 문제가 있으며 원인을 파악하기 위해 도구와 아이디어가 부족합니다.스택 분리 도구 스매싱 버그
4.4.4와 4.7.1 이전에 GCC를 사용하여 최적화 된 컴파일에서 스택 스매싱 문제를 발생시킨 고도의 멀티 스레드 (pthreads) C/C++ 프로그램이 있습니다.
증상은 스레드 중 하나를 생성하는 동안 % RIP뿐 아니라 모든 상위 프레임과 대부분의 레지스터가 0x00 또는 다른 비 감지 주소임을 나타냅니다. 어떤 스레드가 문제를 일으키는지는 겉으로보기에 무작위입니다. 그러나 로그 메시지로 판단 할 경우 동일한 코드 덩어리로 분리 된 것으로 보이며 새로운 스레드를 생성 할 때 반 반복 가능한 시점에있는 것처럼 보입니다.
이로 인해 문제가되는 파일의 print()가 지금까지는 줄이려고 시도 할 때 신뢰할 수없는 것으로 판명 되었기 때문에 문제가되는 코드를 수천 줄의 단일 컴파일 단위보다 좁게 분리하고 격리하는 것이 매우 어려웠습니다. 활성 섹션을 아래로.
extern "C"
{
static ThreadReturnVal ThreadAPI WriterThread(void *act)
{
Recorder *rec = reinterpret_cast (act);
xuint64 writebytes;
LoggerHandle m_logger = XXGetLogger("WriterThread");
if (SetThreadAffinity(rec->m_cpu_mask))
{ ... }
SetThreadPrio((xint32)rec->m_thread_priority);
while (true)
{
... poll a ring buffer ... Hard Spin 100% use on a single core, this is that sort of crazy code.
}
}
내가 디버그 빌드를 시도하지만, 증상, -O2 이상을 빌드 최적화 만 존재 : 결국 스택을 부수고 스레드를 리드
스레드의 생성이다. 내가 Valgrind의/memcheck와 DRD 시도했지만 모두 스택이
A는 -O2 -Wstack 보호기 컴파일 (실패에 도달하고 12 시간의 정도 걸립니다) 날아 전에 어떤 문제를 발견하지 , 아무 잘못 볼 수 없습니다 그러나 -fstack-protector-all을 사용하여 빌드하면 버그로부터 나를 보호 할 수는 있지만 오류는 발생하지 않습니다.
전기 울타리도 트랩되지만 스택이 사라진 후에 만 가능합니다.
질문 : 문제가되는 섹션을 좁히는 데 유용한 다른 도구 나 기술은 무엇입니까?
많은 감사, --Bill
확인. 내가 물지는데 ... 어떤 스택이 부서진거야? –
작성 스레드의 스택 인 경우 일부 코드가 좋을 수도 있습니다. 새 스레드/s에 매개 변수로 무엇을 전달합니까? –
명확성을 위해 g ++ 4.4.2 및 4.8에서 제대로 작동하는지 또는 해당 버전이 테스트되지 않았습니까? –