В C Вы не должны бросать возвращаемое значение malloc
. Указатель на пустоту, возвращенную malloc
, автоволшебно преобразовывается в корректный тип. Однако, если Вы хотите, чтобы Ваш код скомпилировал с компилятором C++, бросок необходим. Предпочтительная альтернатива среди сообщества должна использовать следующее:
int *sieve = malloc(sizeof *sieve * length);
, который дополнительно освобождает Вас от необходимости волноваться об изменении правой стороны выражения, если когда-нибудь Вы изменяете тип sieve
.
Броски плохи, как указали люди. Особенно броски указателя.
Сначала вы можете "разбить основную". К тому времени, когда вы нажмете это, общая библиотека должна быть загружена, и вы сможете установить точку останова в любой из ее подпрограмм.
Необходимо рассмотреть два случая (и из вашего вопроса неясно, какой именно случай у вас):
- ваш исполняемый файл напрямую связан с общей библиотекой:
это означает, что GDB
будет "видеть" символы (и источники) из разделяемой библиотеки, когда вы остановитесь на main
- ваш исполняемый файл динамически загружает разделяемую библиотеку (например, через dlopen
):
в этом случае GDB
не будет "видеть" вашу разделяемую библиотеку до завершения dlopen
.
Поскольку вы не видите символы, когда останавливаетесь на главном, я предполагаю у вас второй случай.
Вы можете выполнить "set stop-on-solib-events 1"
в приглашении (gdb)
, и GDB
будет останавливаться каждый раз, когда создается новая разделяемая библиотека загружены (или выгружены).
Вы можете увидеть, какие библиотеки GDB
"знает", с помощью команды info shared
.
Просто подождите, пока вы не увидите свою целевую библиотеку в этом списке, прежде чем пытаться установить в ней точки останова.
Проверьте это:
http://linux.die.net/man/1/ltrace
он будет отслеживать вызовы вашей библиотеки - возможно, будет полезно.
И "strace" делает то же самое для системных вызовов.
И с этим вы сможете найти точку входа ... Таким образом вы можете установить точку останова в GDB (хотя я сам не могу объяснить детали)