問題の説明 最近のバックグラウンドサービスでは、特定の命令の要求データをディスクに保存する新しい機能が追加されました。具体的な実装では、メンバー変数を使用して要求メッセージ プロキシ ヘッダーを保存します。このヘッダーは、応答が受信され、メッセージ管理クラスが解放されると破棄されます。テストのフィードバックによると、サービスは時々クラッシュするようです。 問題分析 プログラムの 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のセットアップの変更について簡単に説明します。
この記事では、Excelテーブルプラグインを導入するVueの具体的なコードを参考までに共有します。具...
フィルター属性は要素の視覚効果を定義しますぼかし画像にガウスぼかしを適用します。 「半径」の値は、ガ...
目次1. リバースプロキシの準備1. LinuxシステムにTomcatをインストールする2. Tom...
数日前、バスで仕事に行きました。バスのカードリーダーの実際の使用シーンを実際に見て、カードリーダーの...
ウェブサイト構築におけるカラーマッチングは非常に特殊であり、ウェブサイトのテーマ、感情、雰囲気などの...
個人的な実装のスクリーンショット:インストール: npm インストール vue-esign --sa...
導入データベース理論についてさらに学んでいくうちに、さまざまな分離レベルによって起こり得る問題につい...
目次1. 概要1.1 プロトタイプとは何ですか? 1.2 プロトタイプを入手する2. プロトタイプの...
この記事では、参考までにMySQLバックアップスクリプトを紹介します。具体的な内容は次のとおりです。...
自動ビルドとは、Docker Hub を使用して、Dockerfile ファイルを含む GitHub...
LinuxサーバーのデフォルトのSSHポート番号は通常22なので、ほとんどのユーザーはセキュリティ上...
1 公式サイトからMySQL8をダウンロードしてインストールするMySQL8 ダウンロードアドレスこ...
目次1. Cocos Creatorでのオーディオ再生の基本1. 基本2. 一般的な方法2. Coc...
この記事では、参考までに、簡単な計算機能を実装するためのJavaScriptの具体的なコードを紹介し...
最近、nginx-ingress-controller のアプリケーションについて説明した公開アカウ...