Отладка/трассировка в общей библиотеке во время времени выполнения?

В C Вы не должны бросать возвращаемое значение malloc. Указатель на пустоту, возвращенную malloc, автоволшебно преобразовывается в корректный тип. Однако, если Вы хотите, чтобы Ваш код скомпилировал с компилятором C++, бросок необходим. Предпочтительная альтернатива среди сообщества должна использовать следующее:

int *sieve = malloc(sizeof *sieve * length);

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

Броски плохи, как указали люди. Особенно броски указателя.

7
задан Community 23 May 2017 в 10:29
поделиться

3 ответа

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

4
ответ дан 7 December 2019 в 05:25
поделиться

Необходимо рассмотреть два случая (и из вашего вопроса неясно, какой именно случай у вас):
- ваш исполняемый файл напрямую связан с общей библиотекой:
это означает, что GDB будет "видеть" символы (и источники) из разделяемой библиотеки, когда вы остановитесь на main
- ваш исполняемый файл динамически загружает разделяемую библиотеку (например, через dlopen ):
в этом случае GDB не будет "видеть" вашу разделяемую библиотеку до завершения dlopen .

Поскольку вы не видите символы, когда останавливаетесь на главном, я предполагаю у вас второй случай. Вы можете выполнить "set stop-on-solib-events 1" в приглашении (gdb) , и GDB будет останавливаться каждый раз, когда создается новая разделяемая библиотека загружены (или выгружены).

Вы можете увидеть, какие библиотеки GDB "знает", с помощью команды info shared .
Просто подождите, пока вы не увидите свою целевую библиотеку в этом списке, прежде чем пытаться установить в ней точки останова.

3
ответ дан 7 December 2019 в 05:25
поделиться

Проверьте это:

http://linux.die.net/man/1/ltrace

он будет отслеживать вызовы вашей библиотеки - возможно, будет полезно.

И "strace" делает то же самое для системных вызовов.

И с этим вы сможете найти точку входа ... Таким образом вы можете установить точку останова в GDB (хотя я сам не могу объяснить детали)

1
ответ дан 7 December 2019 в 05:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: