問題の説明 最近のバックグラウンドサービスでは、特定の命令の要求データをディスクに保存する新しい機能が追加されました。具体的な実装では、メンバー変数を使用して要求メッセージ プロキシ ヘッダーを保存します。このヘッダーは、応答が受信され、メッセージ管理クラスが解放されると破棄されます。テストのフィードバックによると、サービスは時々クラッシュするようです。 問題分析 プログラムの rel バージョンはテスト環境で実行されています。コンパイル時にデバッグ情報 (-g) を削除し、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 を使用して次のようにスタック情報を出力します。 結論: テスト環境の構築 コードを分析すると、複数のリリースをトリガーするには、作成と破棄が同時に実行されるシナリオを構築する必要があることがわかります。 作成: テストツールを使用して、特定の指示を高頻度かつ一定の時間に送信し、作成プロセスをトリガーできます。 破棄: スケジュールされたタスクで、無効なステータスを報告して破棄プロセスをトリガーできます。 クラッシュの再現速度を高速化するには、作成速度と破棄速度を適度に一致させる必要があります。 破棄が速すぎると、作成プロセスに入ることができなくなります。分析と実験を経て、最終的にテスト ツールを 50 ミリ秒ごとに送信し、バックグラウンド サービスが 50 ミリ秒ごとに無効なステータスを報告するように設定しました。 クラッシュのアイデアをさらに検証するには、破棄操作などのキーパスにログを追加し、 ログ分析 同じバックエンドサービスでも、異なる業務モジュールのログは異なるログファイルに分散しており、分析する際には、全体のプロセスを再現しやすくするために、各部分のログを集約する必要があります。集約中に、必要に応じて各モジュールの最後の数行のログを傍受できます。各ログには正常ログと異常ログが含まれており、これらは 1 つのファイルに集約され、行ごとの相関分析のためにコードと結合されます。 分析プロセス中に、フレームワークに関するいくつかの疑問が生じ、関係する同僚に質問して回答を得ました。現在のメッセージ送受信フレームワークは、メッセージを受信すると、まずメッセージをスレッド プールのメッセージ キューに入れ、セマフォを通じてスレッドを起動し、スレッドはメッセージ キューからメッセージを取得して、メッセージから処理関数を取り出して処理します。 体験のまとめ: ダンプ ファイルが見つかった場合は、ダンプ ファイルが生成された時刻を確認し、その時刻のログと実行可能ファイルをダンプ ファイルと一緒に別のフォルダーに保存して、後で分析できるようにします。現在のログ ファイルと実行可能ファイルが削除および更新される可能性があるためです。問題に対するあらゆる解決策は、既存のシステムに対するより深い理解です。再現環境を構築する場合は、Rel バージョンを使用し、ブレークポイントではなくログのみを使用してプログラムフローを確認してください。 Linux ではネストされたミューテックスを使用できないため、設計の目的が達成されず、潜在的なデッドロックを検出するのが難しくなります。エラーは後で発見するよりも、早めに発見する方がよいでしょう。大胆な仮定を立て、それを慎重に検証すれば、やがて勝利の夜明けが訪れるでしょう。 Linux でバックグラウンド サービスが時々クラッシュする問題を解決する方法については、これで終わりです。Linux でバックグラウンド サービスがクラッシュする場所を特定する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 |
>>: vue3.0 sfcのセットアップの変更について簡単に説明します。
この記事では主に基本的なチャットの実装方法を紹介します。今後は絵文字や写真のアップロードなどの機能も...
目次問題の説明シナリオインターフェースリターンフロントエンドメニューの定義vuex のメソッド問題原...
WeChatアプレットプロジェクトでは、開発モジュールに手書き署名機能が含まれ、WeChatアプレッ...
Remax は、実行時に構文制限のないソリューションを採用した React を使用して小規模なプロ...
目次概要型アサーション構文ではインスタンスオブ構文typeof構文要約する概要TypeScript ...
この記事では、JD.comのカルーセル効果の表示を実現するためのJavaScriptの具体的なコード...
<br />原文: http://uicom.net/blog/?p=762 Faceb...
目次1. Linuxのビット数を確認する2. JDKをダウンロードする3. JDKをインストールする...
最近、本番環境のデータベースがログデータを狂ったように書き込み、主キー値のオーバーフローを引き起こし...
この記事の例では、商品スクリーニング機能を実装するためのjsの具体的なコードを参考までに共有していま...
序文Linux 上で jar パッケージを実行する方法は誰もが知っています。なぜ別々に話したいのでし...
ツリーマップは主にツリーのようなデータ構造を視覚化するために使用され、特殊なタイプの階層です。これを...
ログインページなどのホームページを作成する場合、大きな背景画像を配置する必要があり、さまざまな画面の...
VMware で Linux 仮想マシンを作成し、VMware と仮想マシンのネットワークを設定する...
目次1. ReactJS の紹介2. ReactJSの理解とReactJSの利点1. ReactJS...