Отладка общей библиотеки в разветвленном процессе - PullRequest
2 голосов
/ 11 февраля 2010

Как мне отладить разделяемую библиотеку в этом случае:

Демон проверяет, какое задание настроено на выполнение, и, если он найден, демон будет форкать процесс. Этот процесс будет использовать dlopen / dlsym и т. Д. Для использования общей библиотеки.

Совместно используемая библиотека находится под моим контролем, поэтому я могу разместить ее с отладочной информацией. Пока демон не находится под моим контролем и не может быть остановлен по какой-то причине. В демоне нет доступной отладочной информации.

Вот как я отлаживаю: запустите gdb, подключитесь к демону, установите для follow-fork-mode значение child, установите точку останова с точкой входа в общую библиотеку.

Но это не работает. Сеанс отладки не прерывался в точке останова, которую я вообще установил. Я использую GDB 6.1.1. Спасибо.

Ответы [ 2 ]

2 голосов
/ 11 февраля 2010

Здесь вы можете ввести временную переменную, за которой следует бесконечный цикл:

void my_shared_loopy()
{
  int loopy = 1;
  while (loopy) ;
}

Вызовите это my_shared_loopy() где-нибудь в функции, которую вы пытаетесь отлаживать ... перекомпилируйте свою разделяемую библиотеку, а затем, когда отладчик подключится к функции, которую вы отлаживаете, он зависнет в этом коде ... просто установите значение от loopy до 0, а затем продолжить отладку.

РЕДАКТИРОВАТЬ: как дополнительный помощник, я обычно ставлю

fprintf(stderr, "attach GDB to %d\n", getpid());

перед циклом. Кроме того, если вы не хотите случайно записывать много циклов, переведите цикл в режим сна следующим образом:

void my_shared_loopy()
{
  int loopy = 1;
  fprintf(stderr, "attach GDB to %d\n", getpid());
  while (loopy) sleep(1);
}

Когда вы подключите GDB, вы, скорее всего, будете находиться во сне. Сделайте это, чтобы выйти:

(gdb) finish
(gdb) set var loopy = 0
(gdb) break <wherever you want to debug>
(gdb) continue
0 голосов
/ 11 февраля 2010

Я не знаю, помогает ли это, но в Windows, когда у меня возникают подобные проблемы, я просто вставляю следующий код в мою dll в какой-то метод, который вызывается раньше.

static bool breakHere = true;
if (breakHere) _asm {int 3}

int 3 - это инструкция аппаратного прерывания для процессоров x86

Затем, когда моя dll загружена, и этот код получает удар.Windows выводит диалоговое окно «Хотите отладить приложение», и я говорю «да».После запуска отладчика я изменяю breakHere на true и работаю.

...