Linux で測位バックグラウンド サービスが時々クラッシュする問題の解決方法

Linux で測位バックグラウンド サービスが時々クラッシュする問題の解決方法

問題の説明

最近のバックグラウンドサービスでは、特定の命令の要求データをディスクに保存する新しい機能が追加されました。具体的な実装では、メンバー変数を使用して要求メッセージ プロキシ ヘッダーを保存します。このヘッダーは、応答が受信され、メッセージ管理クラスが解放されると破棄されます。テストのフィードバックによると、サービスは時々クラッシュするようです。

問題分析

プログラムの rel バージョンはテスト環境で実行されています。コンパイル時にデバッグ情報 (-g) を削除し、O3 レベルの最適化を有効にしたため、クラッシュ ダンプ スタックからはプログラム クラッシュのコール スタックのみが確認できます。関数パラメータは最適化により除去されています。こちらはログがないため、再現するには他の方法しか考えられません。クラッシュの原因はポインタの繰り返し解放によるものと推測されるため、引き続き解析を進めていきます。

relバージョンのコール スタックからは、最後に破棄された関数呼び出ししか確認できません。ただし、実際のコードには、破棄された関数呼び出しエントリが 2 つあります。ダンプに表示されるコール スタックの順序が実際のコードと一致しないのはなぜですか。推測では、O3 最適化が有効になっていて、関数がインライン化されています。

分析のために以下の実験を実施しました。

void test_dump()
{
	int* p = NULL;
	*p = 2; // ダンプ発生
}

void test_f2(int b)
{
	1 です。
	テストダンプ();
}

void test_f1(int a)
{
	1 を 0 にする
	テスト_f2(a);
}

int メイン()
{
 テスト_f1(1);
	0を返します。
}

デバッグ モードと Rel モードでは、クラッシュをトリガーし、gdb を使用して次のようにスタック情報を出力します。

結論: Relモードでは、O3 レベルの最適化により呼び出し関数がインライン化されます。クラッシュ ポイントからトレースバックしたときに複数のエントリ ポイントが存在する場合、 dump情報だけではどのエントリ ポイントがクラッシュを引き起こしたかを確認できません。

テスト環境の構築

コードを分析すると、複数のリリースをトリガーするには、作成と破棄が同時に実行されるシナリオを構築する必要があることがわかります。

作成: テストツールを使用して、特定の指示を高頻度かつ一定の時間に送信し、作成プロセスをトリガーできます。 破棄: スケジュールされたタスクで、無効なステータスを報告して破棄プロセスをトリガーできます。 クラッシュの再現速度を高速化するには、作成速度と破棄速度を適度に一致させる必要があります。 破棄が速すぎると、作成プロセスに入ることができなくなります。分析と実験を経て、最終的にテスト ツールを 50 ミリ秒ごとに送信し、バックグラウンド サービスが 50 ミリ秒ごとに無効なステータスを報告するように設定しました。

クラッシュのアイデアをさらに検証するには、破棄操作などのキーパスにログを追加し、 Relバージョンを起動して再現します。長期間のテストを経て、貴重なクラッシュ ダンプ2対応するログを取得しました。各ダンプの再現には 2.5 時間以上かかるため、この問題は散発的であり、マルチスレッドの競合に関連している可能性が高いことがわかります。問題を再現するには少し時間がかかりますが、取得したダンプとログがあれば問題を特定するのに十分です。

ログ分析

同じバックエンドサービスでも、異なる業務モジュールのログは異なるログファイルに分散しており、分析する際には、全体のプロセスを再現しやすくするために、各部分のログを集約する必要があります。集約中に、必要に応じて各モジュールの最後の数行のログを傍受できます。各ログには正常ログと異常ログが含まれており、これらは 1 つのファイルに集約され、行ごとの相関分析のためにコードと結合されます。

分析プロセス中に、フレームワークに関するいくつかの疑問が生じ、関係する同僚に質問して回答を得ました。現在のメッセージ送受信フレームワークは、メッセージを受信すると、まずメッセージをスレッド プールのメッセージ キューに入れ、セマフォを通じてスレッドを起動し、スレッドはメッセージ キューからメッセージを取得して、メッセージから処理関数を取り出して処理します。
アプリケーション層で異なるメッセージを処理する場合、同じ変数を処理するときに競合状態が発生する可能性があります。解放されたポインタを分析すると、正常に解放されたポインタには一定のルールがあることがわかります。クラッシュが発生すると、解放されたポインタの値は明らかに正常な値と異なります。

体験のまとめ: ダンプ ファイルが見つかった場合は、ダンプ ファイルが生成された時刻を確認し、その時刻のログと実行可能ファイルをダンプ ファイルと一緒に別のフォルダーに保存して、後で分析できるようにします。現在のログ ファイルと実行可能ファイルが削除および更新される可能性があるためです。問題に対するあらゆる解決策は、既存のシステムに対するより深い理解です。再現環境を構築する場合は、Rel バージョンを使用し、ブレークポイントではなくログのみを使用してプログラムフローを確認してください。 Linux ではネストされたミューテックスを使用できないため、設計の目的が達成されず、潜在的なデッドロックを検出するのが難しくなります。エラーは後で発見するよりも、早めに発見する方がよいでしょう。大胆な仮定を立て、それを慎重に検証すれば、やがて勝利の夜明けが訪れるでしょう。

Linux でバックグラウンド サービスが時々クラッシュする問題を解決する方法については、これで終わりです。Linux でバックグラウンド サービスがクラッシュする場所を特定する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

<<:  JSONデータをHTMLで表示する方法

>>:  vue3.0 sfcのセットアップの変更について簡単に説明します。

推薦する

Vue は Websocket カスタマー サービス チャット機能を実装します

この記事では主に基本的なチャットの実装方法を紹介します。今後は絵文字や写真のアップロードなどの機能も...

Vue で動的に追加されたルーティング ページの更新時に失敗する理由と解決策

目次問題の説明シナリオインターフェースリターンフロントエンドメニューの定義vuex のメソッド問題原...

WeChatアプレットキャンバスが署名機能を実装

WeChatアプレットプロジェクトでは、開発モジュールに手書き署名機能が含まれ、WeChatアプレッ...

React を使って小さなプログラムを書くための Remax フレームワークのコンパイル プロセス分析 (推奨)

Remax は、実行時に構文制限のないソリューションを採用した React を使用して小規模なプロ...

TypeScript における型保護の詳細な説明

目次概要型アサーション構文ではインスタンスオブ構文typeof構文要約する概要TypeScript ...

JavaScript が Jingdong のカルーセル効果を模倣

この記事では、JD.comのカルーセル効果の表示を実現するためのJavaScriptの具体的なコード...

Facebookの情報アーキテクチャの分析

<br />原文: http://uicom.net/blog/?p=762 Faceb...

Linux で JDK をインストールして環境変数を設定する方法 (この記事で十分です)

目次1. Linuxのビット数を確認する2. JDKをダウンロードする3. JDKをインストールする...

Prometheus を使用して、MySQL の自動増分主キーの残りの使用可能パーセンテージをカウントします。

最近、本番環境のデータベースがログデータを狂ったように書き込み、主キー値のオーバーフローを引き起こし...

シンプルな商品スクリーニング機能を実現するjs

この記事の例では、商品スクリーニング機能を実装するためのjsの具体的なコードを参考までに共有していま...

Centos7 サーバーで jar パッケージ プロジェクトを開始する最良の方法

序文Linux 上で jar パッケージを実行する方法は誰もが知っています。なぜ別々に話したいのでし...

ツリー チャートの実装方法に関する Echarts チュートリアル

ツリーマップは主にツリーのようなデータ構造を視覚化するために使用され、特殊なタイプの階層です。これを...

CSSは背景画像の画面適応を実現する

ログインページなどのホームページを作成する場合、大きな背景画像を配置する必要があり、さまざまな画面の...

Linux仮想マシンを作成し、仮想マシンネットワークを設定する方法に関するVMwareの詳細なチュートリアル

VMware で Linux 仮想マシンを作成し、VMware と仮想マシンのネットワークを設定する...

ReactJs 基礎チュートリアル - 基本編

目次1. ReactJS の紹介2. ReactJSの理解とReactJSの利点1. ReactJS...