2013-03-15 2 views
0

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

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

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

линия отладчик дает ниже ошибки Нет источника для «0x40174c84».

Итак, что мне делать?

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

Спасибо.

ответ

1

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

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

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

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

Короче говоря, его правая боль в арсенале.

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

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

--EDIT--

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

Смежные вопросы