У меня есть многопоточная программа C ++, которая в некоторых редких случаях блокируется. Проблему сложно воспроизвести, и я могу воспроизвести ее только на удаленной машине.
Метод, который я хочу использовать для решения этой проблемы:
- запустить программу
- ожидание тупика
- отправить сигнал прерывания для создания дампа ядра
- скопировать дамп обратно на мой локальный компьютер
- используйте gdb для его отладки
У меня нет gdb на удаленной машине, и я не могу ничего установить на него.
Проблема в том, что когда я отлаживаю дамп ядра (полученный из заблокированного или нормально работающего процесса на удаленном компьютере), обратная трассировка большинства потоков показывает только:
(gdb) bt
#0 pthread_cond_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:261
#1 0x0000000000000000 in ?? ()
Я использую статически связанный двоичный файл, который компилируется с опциями "-g -O1".
Когда я прерываю процесс того же двоичного файла на моей локальной машине, GDB может извлечь весь стек из дампа памяти, и такой проблемы нет (однако я не могу воспроизвести тупик).
Мой удаленный компьютер - SLES, а мой локальный компьютер - Ubuntu.
Есть идеи?
Edit:
Нашел кого-то еще с той же проблемой, но без решения:
http://groups.google.com/group/google-coredumper/browse_thread/thread/2ca9bcf9465d1050
(Я не использую Google Coredumper, но кажется, что Google Coredumper не удается с той же ошибкой, это предполагает, что, возможно, проблема с SLES 11)