В общем-то дело ясное, запускаем gdb, ловим сегфолт на вызове free. Смотрим значение указателя - gdb пишет что там есть строка, которую и надо освободить, значит указатель не битый и уже этот сегмент освободили. Надо искать где уже осводили.
Но вот как найти место, где оно освобождается прежде чем надо? В голову приходит модификация free, дабы по старому адресу он записал какую-то метку, что из треда N было обращение сюда. Но что-то это пахнет написанием велосипеда.
Брейки на запись ставить не вариант - записей много. Как еще такое дебажить?