0

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

Я работаю над сервером/клиентской системой, использующей infiniband как учебное упражнение/готовую к предстоящей программе работы. Первоначально у меня было 2 исполняемых файла, каждый из которых включал в себя один и тот же исходный код, поэтому я разделил их на обычные файлы (являющиеся RDMAConnectionManager.cpp и RDMAConnection.cpp вместе со своими заголовками).

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

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

По прихоти, я изменил его из SHARED в библиотеку STATIC. Это сработало отлично! Мое понимание статики заключалось в том, что она включала все символы из библиотек, которые она связывает, в то время как общий - нет. Однако теперь, когда я нашел эту неприятную проблему, я чувствую, что что-то упускаю.

С тех пор я немного поработал и чувствую себя более комфортно с различиями, однако я до сих пор не знаю, что приводит к этой проблеме (или как ее увидеть в будущем). Кто-нибудь знает, почему может произойти что-то подобное?

+0

Это не сработало отлично. Вы перемещали материал, который маскировал segfault, но он все еще там. Совместные библиотеки существуют уже 50 лет. RDMA существует около 10. Ваш код работает около 2 дней. Что говорит вам Бритва Оккама? – stark

+0

Возможно, вы можете проверить с помощью 'ldd', что вы на самом деле используете динамическую библиотеку, которую вы ожидаете использовать. –

ответ

0

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

Так как различное картографирование памяти вызовет SegFault? Если у вас проблемы с памятью в вашем коде, например, из-за ограниченного доступа, неправильной записи или недопустимого чтения, в зависимости от карты памяти вашего двоичного файла, она может генерировать SegFault или нет, на самом деле вы можете получить доступ к байтам из области, зарезервированной для буфера, но внезапно этот выход доступа попадает в другой буфер или область памяти, которую вы зарезервировали, и вы не видите никаких SegFault (у вашего кода все еще есть проблемы). С различными сборками порядок областей памяти или отображение памяти может измениться, и именно поэтому вы получили SegFault в разных сборках.

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

  • Нет связанных вопросов^_^