Ошибка потока удаленной отладки Linux (GDBServer)

У меня есть устройство ARM, и я хочу его отладить. Мой главный компьютер - Linux 12.04, и я использую Eclipse. GDBServer запущен на моем целевом устройстве.

Я могу отлаживать приложение с одним процессом. Но когда я хочу отлаживать многопоточное приложение, которое содержит объекты pthread, отладка завершается ошибкой. Я бегу шаг за шагом, но когда я пришел в себя

pthread_create(&timerSettings.timerThread, NULL, &timerThread, NULL);

Отладчик строки выдает ошибку ниже. Отсутствует доступный источник для «0x40174c84».

Так что я должен делать?

Любое предложение?

Спасибо.


person Murat    schedule 15.03.2013    source источник


Ответы (1)


Выполняя шаг за шагом, вы фактически просите отладчик перейти к функции phread_create (), и, конечно же, у вас нет исходного кода для этого. Если, как я подозреваю, вы ожидали, что отладчик приведет вас к источнику вашего потока, что ж, у меня плохие новости; так не работает.

Если вы перейдете через pthread_create (), который создаст ваш поток, который должен отображаться в списке задач в Eclipse, если вы находитесь в перспективе отладчика. Вы можете выбрать свою тему оттуда. Если вы это сделаете, представление исходного кода переместится туда, куда попал этот поток (появятся новые плохие новости). Помните, что для всего этого нужны относительно современные версии gdb (6 и выше, насколько я помню).

Теперь действительно начинаются ваши проблемы. Отладка потоков в gdb не очень хороша. При выборе темы вы можете обнаружить, что исходный код не отображается. Это потому, что, хотя вы перешагнули через pthread_create (), это не означает, что поток продвинулся до вашей первой строки исходного кода. Это потому, что, когда gdb приостанавливает программу, каждый поток в этой программе приостанавливается, и новый поток, вероятно, не вышел из исходного кода потока стандартной библиотеки. Таким образом, вы должны установить точку останова в первой строке исходного кода в вашем потоке и позволить программе свободно работать до тех пор, пока эта точка останова не будет достигнута.

Но подождите - тем временем ваш основной поток ускользнул вдаль, и вы потеряли над ним контроль. Вы не можете установить для этого точку останова, потому что ваша программа будет приостановлена ​​GDB при достижении любой точки останова.

Короче это правильная боль в арсенале.

Вы можете вводить команды gdb в Eclipse. Это немного помогает, потому что затем вы можете делать такие вещи, как установка точек останова для конкретных потоков и установка gdb в непрерывный режим и фоновый асинхронный режим. Это лучше, чем ничего, но, по моему опыту, не справляется полностью. Еще хуже то, что Eclipse, кажется, совершенно не знает о них (возможно, я устарел), поэтому вам приходится вводить команды вручную. В этом случае вы можете вообще не запускать Eclipse.

Предлагаю вам взглянуть на это. Хороший трюк - поместить цикл сна в начало всех ваших потоков с условием цикла, являющимся некоторой переменной, которая никогда не изменяется. Таким образом, когда поток создан, вы можете переключиться на него, настроить любые точки останова, которые вы хотите, а затем самостоятельно изменить значение переменной цикла, чтобы при продолжении потока он выходил из цикла и бежал к вашим точкам останова.

--РЕДАКТИРОВАТЬ--

Кажется, я устарел. Взгляните на это. Похоже, Eclipse теперь знает о непрерывном режиме и точках останова для конкретных потоков. Те, у кого в каждом потоке есть цикл ожидания при запуске (возможно, Eclipse может решить эту проблему сейчас), сделают отладку потоков допустимой.

person bazza    schedule 16.03.2013