0

これは多少のメタ質問かもしれませんが、私の問題は共有ライブラリと静的ライブラリの知識が不足しているからです。セグメンテーションフォールトプログラムは共有ライブラリにコンパイルされますが、スタティックではありません

私は、infinibandを学習/次回のワークプログラムの準備として使用しているサーバー/クライアントシステムに取り組んでいます。もともと私は2つの実行可能ファイルを持っていました。各ファイルには同じソースコードが含まれていましたので、これらのファイルを共通ファイル(ヘッダーと共にRDMAConnectionManager.cppとRDMAConnection.cpp)に分割しました。

私は、これらのファイルをライブラリにしたいと決めたので、サーバーとクライアントが同じ低レベルコードを使用していることを確認できます。私はいつも共有ライブラリを使用していましたので、cmake経由で共有ライブラリを作成して、標準に従って処理しました。

問題は、すぐに私はこれをしたとして、私は、具体的ib_verbs機能と、ライブラリrdmacmが提供する機能でセグメンテーションフォールトを得るでしょう、でした。私はそれが順序を結ぶことと関係があると思ったが、助けを変えたものは何もなかった。

気楽に、私はそれをSHAREDライブラリからSTATICライブラリに変更しました。これは完全に機能しました!私が静的なことを理解しているのは、リンクしているライブラリのすべてのシンボルが含まれていて、共有されていないということです。しかし、今私はこの厄介な問題を見つけたので、私は何かが欠けているように感じる。

私はそれ以来、いくつかの読書を行いましたし、違いについてもっと気楽に感じましたが、私はまだこの問題のどのような原因(または将来の見方)がわかりません。誰かがなぜこのような何かが起こるかもしれないという考えを持っていますか?

+0

完全に機能しませんでした。あなたはセグメンテーションを偽装したものを動かしましたが、まだそこにあります。共有ライブラリは50年ほど前から存在しています。 RDMAは10周间。あなたのコードは2日間ぐらいです。オッカムの剃刀は何を教えてくれるのですか? – stark

+0

おそらく 'ldd'を使って、実際に使用していると思われる動的ライブラリを使用しているかどうかを確認できます。 –

答えて

0

SegFaultの原因を明確にする必要があります。たとえば、プログラムをgdbで実行し、segfaultの発生場所を特定する必要があります。 多くの場合、メモリエラーが発生する可能性があります。メモリエラーはネイティブアプリケーションでよく発生する問題であり、回避する必要があります。しかし、いくつかの条件でメモリエラーがSegFaultをどのように表示するかを尋ねることがあります。 答えはあなたのプログラムのメモリマッピングについてです。コードを変更したり(別のものを追加または削除する)、別のコンパイラや異なるスイッチでコンパイルすると、異なるメモリマップが得られるかもしれません。 たとえば、デバッグビルドまたはリリースビルド、または状況に応じて、共有ビルドまたは静的ビルドでは、生成されたバイナリファイルのメモリマッピングが異なる場合があります。

どのように異なるメモリマッピングがSegFaultを引き起こしますか?バイナリのメモリマップによってSegFaultが生成されるかどうかにかかわらず、実際にはバッファ用に確保された領域からバイトにアクセスした可能性がありますが、このアウトアクセスは予約した別のバッファまたはメモリ領域に落ちてしまい、セグフォルトは表示されません(コードにはまだ問題があります)。 異なるビルドでは、メモリ領域やメモリマッピングの順序が変わることがあります。そのため、異なるビルドでSegFaultが得られたのです。

関連する問題