Это может быть несколько мета вопрос, так как я думаю, что моя проблема проистекает из-за недостатка знаний об общих и статических библиотеках.
Я работаю на системе сервер / клиент, использую infiniband в качестве учебного упражнения / подготовки к предстоящей рабочей программе. Первоначально у меня было 2 исполняемых файла, каждый из которых включал в себя один и тот же исходный код, поэтому я разделил их на общие файлы (RDMAConnectionManager.cpp и RDMAConnection.cpp вместе с их заголовками).
В какой-то момент я решил, что хочу, чтобы эти файлы были библиотекой, чтобы я мог убедиться, что мой сервер и клиент используют один и тот же код более низкого уровня. Я всегда использовал разделяемые библиотеки, поэтому я пошел по нормам, создавая разделяемую библиотеку с помощью cmake.
Проблема была в том, что, как только я это сделал, я получил ошибку сегментации в функции, предоставляемой библиотекой. rdmacm, конкретно с ib_verbs функции. Я думал, что это может быть связано с порядком связи, но я ничего не изменил, помогите.
По своей прихоти я изменил ее с SHARED на STATIC. Это сработало отлично! Мое понимание статики заключалось в том, что она включает в себя все символы из библиотек, на которые она ссылается, в то время как общая не включает. Однако теперь, когда я нашел эту неприятную проблему, я чувствую, что что-то упустил.
С тех пор я немного больше читаю и чувствую себя более комфортно в связи с различиями, однако я до сих пор не знаю, что привело к этой проблеме (или как ее увидеть в будущем). У кого-нибудь есть идеи, почему может произойти нечто подобное?
Вы должны уточнить причину SegFault, например, запустить вашу программу с помощью gdb и определить, где происходит segfault.
Во многих случаях у вас могут быть ошибки памяти, ошибки памяти являются очень распространенными проблемами в нативных приложениях, и вы должны избегать их. Но, может быть, вы спросите, как ошибка памяти будет отображать SegFault только в некоторых условиях.
Ответ заключается в отображении памяти вашей программы: если вы измените код (добавив или удалив что-то) или скомпилируете его под другим компилятором или с другими ключами, у вас могут появиться разные карты памяти.
Например, сборки отладки или выпуска, или в вашей ситуации общая или статическая сборки могут отличаться в отображении памяти сгенерированного двоичного файла.
Так как различное отображение памяти вызовет SegFault? Если у вас есть проблемы с памятью в вашем коде, такие как доступ с ограничениями, неправильная запись или неправильное чтение, в зависимости от карты памяти вашего двоичного файла, он может генерировать SegFault или нет, на самом деле вы могли получить доступ к байтам из области, зарезервированной для буфера, но внезапно этот доступ падает в другой буфер или область памяти, которую вы зарезервировали, и вы не видите никаких SegFaults (ваш код все еще имеет проблемы).
В разных сборках порядок областей памяти или отображения памяти может меняться, и поэтому вы получили SegFault в разных сборках.
Других решений пока нет …