Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > чем искать ошибку блокировки мьютекса?


Автор: boostcoder 14.11.2010, 15:58
всем привет.
есть код написанный на С++, преимущественно с использованием boost.
код многопоточный.
в некоторый момент ловлю исключение:
Цитата

Throw in function (unknown)
Dynamic exception type: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::lock_error> >
std::exception::what: boost::lock_error

по последней строке, могу судить о том, что что-то с блокировкой мьютексов. а их в коде не мало.

собственно вопрос: как понять где/откуда бросается исключение? какие тулзы/инструменты использовать?
работаю в QtCreator. так и не понял как в нем можно просмотреть стек вызовов.

спасибо.

Автор: bsa 14.11.2010, 19:23
Цитата(boostcoder @  14.11.2010,  16:58 Найти цитируемый пост)
как понять где/откуда бросается исключение?

Поставь точку останова на throw (делается когда программа уже запущена)

Цитата(boostcoder @  14.11.2010,  16:58 Найти цитируемый пост)
так и не понял как в нем можно просмотреть стек вызовов.

В режиме отладки внизу на левой половине окна.

Автор: boostcoder 14.11.2010, 19:28
Цитата(bsa @  14.11.2010,  19:23 Найти цитируемый пост)
Поставь точку останова на throw

в том то и дело, что после этого throw, программа просто завершается. сама smile 

Цитата(bsa @  14.11.2010,  19:23 Найти цитируемый пост)
В режиме отладки внизу на левой половине окна.

в режиме отладки стек-то есть. а вот как бы его увидеть когда программа уже упала?..

Автор: bsa 15.11.2010, 00:01
boostcoder, а ты случаем не в режиме release собрал прогу? В режиме отладки программа в случае ошибки останавливается и ждет от тебя действий.

Автор: boostcoder 15.11.2010, 00:17
Цитата(bsa @  15.11.2010,  00:01 Найти цитируемый пост)
ты случаем не в режиме release собрал прогу?

нет smile 

Цитата(bsa @  15.11.2010,  00:01 Найти цитируемый пост)
В режиме отладки программа в случае ошибки останавливается и ждет от тебя действий.

ну не знаю... в моем случае она просто завершается.

Автор: bsa 15.11.2010, 00:42
boostcoder, я тебе говорю, или ты не под отладчиком запустил, или у тебя программа в релизе.

Добавлено через 1 минуту и 24 секунды
Цитата(boostcoder @  15.11.2010,  01:17 Найти цитируемый пост)
ну не знаю... в моем случае она просто завершается. 

А, я забыл, что у тебя не сегфолт, а исключение... Тогда действительно будет нормально завершаться, если точки останова не понаделал. В т.ч. и на throw.
Попробуй еще "синхронизировать" точки останова.

Автор: boostcoder 15.11.2010, 01:09
Цитата(bsa @  15.11.2010,  00:42 Найти цитируемый пост)
"синхронизировать" точки останова.

это что? как?

Автор: MAKCim 15.11.2010, 13:08
boostcoder, 
обычно правильное логирование решает все проблемы ;)

Добавлено через 7 минут и 51 секунду
еще можно через set_terminate поставить свой обработчик и на него уже бряк
Код

#include <iostream>
#include <exception>

static void my_terminate()
{
    std::cout<<"my_terminate()"<<std::endl;
}

int main()
{
    std::set_terminate(my_terminate);
    throw 1;
    return 0;
}

Код

# gdb -q
(gdb) file test
Reading symbols from /home/rei3er/test...done.
(gdb) break my_terminate
Breakpoint 1 at 0x80487ca: file test.cpp, line 6.
(gdb) run
Starting program: /home/rei3er/test
Breakpoint 1, my_terminate () at test.cpp:6
6        std::cout<<"my_terminate()"<<std::endl;
(gdb) bt
#0  my_terminate () at test.cpp:6
#1  0xb76eb055 in ?? () from /usr/lib/libstdc++.so.6
#2  0xb76eb092 in std::terminate () from /usr/lib/libstdc++.so.6
#3  0xb76eb1ca in __cxa_throw () from /usr/lib/libstdc++.so.6
#4  0x08048897 in main () at test.cpp:12

Автор: boostcoder 20.11.2010, 22:45
как-то недопёр smile 
спасибо. помогло.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)