Мягко говоря, у меня небольшая проблема с памятью, и у меня заканчиваются инструменты и идеи, чтобы изолировать причину.
У меня очень многопоточная программа (pthreads) C/С++, которая разработала проблему разбивки стека под оптимизированными компиляторами с GCC после 4.4.4 и до 4.7.1.
Симптом заключается в том, что во время создания одного из потоков я получаю полный стек, а не только% 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, но оба не смогли найти какую-либо проблему до того, как стек сдулся (и для достижения сбоя потребуется около 12 часов).
Компиляция с -O2 -Wstack-protector не видит ничего плохого, однако сборка с -fstack-protector - все это защитит меня от ошибки, но не испугает ошибок.
Электрический забор также ловушки, но только после того, как стек ушел.
Вопрос: Какие другие инструменты или методы будут полезны для сужения раздела о нарушении?
Большое спасибо, --Bill