1. ホーム
  2. c

セグメンテーションフォールト(Core Dump)問題

2022-02-16 04:38:07

最近、プロジェクトで作業しているとき、cでコンパイルされたダイナミックリンクライブラリをpythonで呼び出すと、次のような結果になりました。 セグメンテーションフォールト(コアダンプ) の問題が発生しました。

情報を検索した結果、原因は空間のセグメンテーションエラーによるものであることが判明しました。原因としては、以下のようにいくつか考えられます。

このエラー(実際にはアクセスすべきでないメモリ上の何かにアクセスしている)の原因として考えられること。

1.メモリアクセスが範囲外である。

(1) 配列のアクセスは、添え字が範囲外であるため、範囲外となります。

(2) 文字列を検索するとき、文字列の終端記号で終端を決定するが、そのような終端はない。

(3) strcpy, strcat, sprintf, strcmp,strcasecmp などの文字列操作関数を使用すると、文字で定義された格納可能な最大範囲を超えてしまいます。strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp などの関数を使用して、範囲外の読み書きをしないようにしてください。

2. マルチスレッドプログラムでは、スレッドセーフでない関数を使用する。

3、マルチスレッドは、ロックで保護されていないデータを読み書きします。

複数のスレッドから同時にアクセスされるグローバルデータについては、ロック保護を付加するなどの配慮が必要で、そうしないとコアダンプが発生しやすくなります

4. 不正なポインタ

(1) NULLポインタの使用

(2) ポインタの型を任意に強制変換する。このような強制変換は、実はとても危険です。変換する型であることを確認しない場合、簡単にエラーになります。強制変換した型が強制変換した型としてアクセスされるので、アクセスしてはいけないメモリにアクセスすることが可能だからです。

5. スタックオーバーフロー

大きなローカル変数は使わないでください(ローカル変数はスタック上に確保されるため)。スタックオーバーフローを起こしやすく、システムのスタックやヒープ構造が壊れて、不可解なエラーにつながる可能性があります。  

私がここで抱えている問題の現象を分析するステップ。

(1)年齢検出は問題ないが、性別検出ができない。

(2)両モデルとも同じで、コードも基本的に同じなので、2つの部分を比較してみました。発見:年齢検出のインクルードのncnnヘッダーファイルは、ジェンダーと同じではありません。

(3)発見。性別判定に含まれるncnnヘッダファイルは古いバージョンですが、ncnnスタティックライブラリは最新のものです。このため、ヘッダーファイルで定義されている構造体がライブラリと不整合になり、メモリ読み出しに問題が発生します。

(4) 解決策 性別判定に含まれるncnnヘッダーファイルを年齢判定と一致するように変更し、問題解決。