(57)【要約】  本発明は従来技術ではアプリケーションプログラムにおける異常スタック情報をタイムリーに取得してアップロードするのが困難であるという技術的課題を解決する。本願発明は、異常スタック情報取得方法を開示する。当該方法は、アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得することと、前記異常信号を検出したときにアプリケーション層が記録した第２の異常スタック情報を読み取ることと、前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了することと、を含む。本願発明はさらに、異常スタック情報取得装置及びコンピュータ読み取り可能な記憶媒体を提供する。
2019525275.tif 000002
【特許請求の範囲】
【請求項１】
異常スタック情報取得方法であって、
アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得することと、
前記異常信号を検出したときにアプリケーション層が記録した第２の異常スタック情報を読み取ることと、
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了することと、を含むことを特徴とする異常スタック情報取得方法。
【請求項２】
アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得する前記ステップは、
前記アイテムが動作する過程で所定の異常信号を検出したとき、前記アイテムの動作するオペレーティングシステムのバージョン情報を確定することと
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼びして実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成することと、を含むことを特徴とする請求項１に記載の異常スタック情報取得方法。
【請求項３】
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成する前記ステップは、
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得することと、
前記アドレス情報に基づき異常スタックデータを取得し、検出した前記異常信号の信号タイプを取得することと、
前記信号タイプと前記異常スタックデータとを組み合わせて前記第１の異常スタック情報を生成することと、を含むことを特徴とする請求項２に記載の異常スタック情報取得方法。
【請求項４】
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了する前記ステップは、
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換することと、
前記第３の異常スタック情報と前記第２の異常スタック情報とを組み合わせて前記サーバに報告し、且つ報告を完了した後、前記アイテムを終了することと、を含むことを特徴とする請求項２に記載の異常スタック情報取得方法。
【請求項５】
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了する前記ステップは、
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換することと、
前記第３の異常スタック情報と前記第２の異常スタック情報とを組み合わせて前記サーバに報告し、且つ報告を完了した後、前記アイテムを終了することと、を含むことを特徴とする請求項３に記載の異常スタック情報取得方法。
【請求項６】
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換する前記ステップは、
情報復元スクリプトを起動し、前記情報復元スクリプトに基づき、前記第１の異常スタック情報における関数名を順次前記シンボルテーブルにおける関数名と１つずつマッチングし、前記第１の異常スタック情報における関数名に対応するファイル名及び行番号を取得することと、
取得したファイル名及び行番号を元の第１の異常スタック情報に追加し、前記サーバが読み取り可能な第３の異常スタック情報を生成することと、を含むことを特徴とする請求項３に記載の異常スタック情報取得方法。
【請求項７】
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換する前記ステップは、
情報復元スクリプトを起動し、前記情報復元スクリプトに基づき、前記第１の異常スタック情報における関数名を順次前記シンボルテーブルにおける関数名と１つずつマッチングし、前記第１の異常スタック情報における関数名に対応するファイル名及び行番号を取得することと、
取得したファイル名及び行番号を元の第１の異常スタック情報に追加し、前記サーバが読み取り可能な第３の異常スタック情報を生成することと、を含むことを特徴とする請求項４に記載の異常スタック情報取得方法。
【請求項８】
異常スタック情報取得装置であって、
記憶手段と、処理手段と、前記記憶手段に記憶されており、且つ前記処理手段で動作可能な異常スタック情報取得プログラムとを含み、前記異常スタック情報取得プログラムが前記処理手段により実行されるとき、
アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得するステップと、
前記異常信号を検出したときにアプリケーション層が記録した第２の異常スタック情報を読み取るステップと、
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了するステップと、を実現することを特徴とする異常スタック情報取得装置。
【請求項９】
アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得する前記ステップは、
前記アイテムが動作する過程で所定の異常信号を検出したとき、前記アイテムの動作するオペレーティングシステムのバージョン情報を確定することと
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼びして実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成することと、を含むことを特徴とする請求項８に記載の異常スタック情報取得装置。
【請求項１０】
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成する前記ステップは、
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得することと、
前記アドレス情報に基づき異常スタックデータを取得し、検出した前記異常信号の信号タイプを取得することと、
前記信号タイプと前記異常スタックデータとを組み合わせて前記第１の異常スタック情報を生成することと、を含むことを特徴とする請求項８に記載の異常スタック情報取得装置。
【請求項１１】
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了する前記ステップは、
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換することと、
前記第３の異常スタック情報と前記第２の異常スタック情報とを組み合わせて前記サーバに報告し、且つ報告を完了した後、前記アイテムを終了することと、を含むことを特徴とする請求項９に記載の異常スタック情報取得装置。
【請求項１２】
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了する前記ステップは、
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換することと、
前記第３の異常スタック情報と前記第２の異常スタック情報とを組み合わせて前記サーバに報告し、且つ報告を完了した後、前記アイテムを終了することと、を含むことを特徴とする請求項１０に記載の異常スタック情報取得装置。
【請求項１３】
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換する前記ステップは、
情報復元スクリプトを起動し、前記情報復元スクリプトに基づき、前記第１の異常スタック情報における関数名を順次前記シンボルテーブルにおける関数名と１つずつマッチングし、前記第１の異常スタック情報における関数名に対応するファイル名及び行番号を取得することと、
取得したファイル名及び行番号を元の第１の異常スタック情報に追加し、前記サーバが読み取り可能な第３の異常スタック情報を生成することと、含むことを特徴とする請求項１０に記載の異常スタック情報取得装置。
【請求項１４】
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換する前記ステップは、
情報復元スクリプトを起動し、前記情報復元スクリプトに基づき、前記第１の異常スタック情報における関数名を順次前記シンボルテーブルにおける関数名と１つずつマッチングし、前記第１の異常スタック情報における関数名に対応するファイル名及び行番号を取得することと、
取得したファイル名及び行番号を元の第１の異常スタック情報に追加し、前記サーバが読み取り可能な第３の異常スタック情報を生成することと、を含むことを特徴とする請求項１１に記載の異常スタック情報取得装置。
【請求項１５】
コンピュータ読み取り可能な記憶媒体であって、
当該媒体に異常スタック情報取得プログラムが記憶されており、前記異常スタック情報取得プログラムが処理手段により実行されるとき、
アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得するステップと、
前記異常信号を検出したときにアプリケーション層が記録した第２の異常スタック情報を読み取るステップと、
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了するステップと、を実現することを特徴とするコンピュータ読み取り可能な記憶媒体。
【請求項１６】
アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得する前記ステップは、
前記アイテムが動作する過程で所定の異常信号を検出したとき、前記アイテムの動作するオペレーティングシステムのバージョン情報を確定することと
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼びして実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成することと、を含むことを特徴とする請求項１５に記載のコンピュータ読み取り可能な記憶媒体。
【請求項１７】
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成する前記ステップは、
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得することと、
前記アドレス情報に基づき異常スタックデータを取得し、検出した前記異常信号の信号タイプを取得することと、
前記信号タイプと前記異常スタックデータとを組み合わせて前記第１の異常スタック情報を生成することと、を含むことを特徴とする請求項１６に記載のコンピュータ読み取り可能な記憶媒体。
【請求項１８】
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了する前記ステップは、
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換することと、
前記第３の異常スタック情報と前記第２の異常スタック情報とを組み合わせて前記サーバに報告し、且つ報告を完了した後、前記アイテムを終了することと、を含むことを特徴とする請求項１６に記載のコンピュータ読み取り可能な記憶媒体。
【請求項１９】
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了する前記ステップは、
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換することと、
前記第３の異常スタック情報と前記第２の異常スタック情報とを組み合わせて前記サーバに報告し、且つ報告を完了した後、前記アイテムを終了することと、を含むことを特徴とする請求項１７に記載のコンピュータ読み取り可能な記憶媒体。
【請求項２０】
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換する前記ステップは、
情報復元スクリプトを起動し、前記情報復元スクリプトに基づき、前記第１の異常スタック情報における関数名を順次前記シンボルテーブルにおける関数名と１つずつマッチングし、前記第１の異常スタック情報における関数名に対応するファイル名及び行番号を取得することと、
取得したファイル名及び行番号を元の第１の異常スタック情報に追加し、前記サーバが読み取り可能な第３の異常スタック情報を生成することと、を含むことを特徴とする請求項１７に記載のコンピュータ読み取り可能な記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
「関連出願の相互参照」
本願は、パリ条約により２０１７年０６月１２日に提出した「異常スタック情報取得方法、装置及びコンピュータ読み取り可能な記憶媒体」と題する中国特許出願（出願番号ＣＮ２０１７１０４４０２８８．８）の優先権を主張し、その全体内容を参照し、ここに援用する。
【０００２】
本願発明は、コンピュータ技術分野に関し、詳しく言えば、異常スタック情報取得方法、装置及びコンピュータ読み取り可能な記憶媒体に関する。
【背景技術】
【０００３】
従来、アプリケーションのプログラム設計に不具合が存在すると、ユーザが利用する過程で、アプリケーションが動作異常により潰れてクラッシュし、正常に使用できなくなることがある。したがって、アプリケーション開発者にとっては、アプリケーションに異常が発生するときに生成した異常スタック情報を取得し、そしてアプリケーションに発生する異常問題のコードについて、その位置を特定し分析する必要がある。
【０００４】
従来の異常スタック情報取得方法としては一般的に、アプリケーションに異常が発生してクラッシュした後、プログラムが再起動するときに、ローカルから異常スタック情報を取得してアップロードする。しかしながら、このような処理方法には、アプリケーションに異常が発生してクラッシュした後、ユーザがアプリケーションを再起動させないとアップロードできないという問題点があった。
【発明の概要】
【発明が解決しようとする課題】
【０００５】
本願発明は、従来技術ではアプリケーションプログラムにおける異常スタック情報をタイムリーに取得してアップロードするのが困難であるという技術的課題を解決するために、異常スタック情報取得方法、装置及びコンピュータ読み取り可能な記憶媒体を提供することを目的とする。
【課題を解決するための手段】
【０００６】
上記の目的を達成するために、本願発明は、異常スタック情報取得方法を提供する。当該方法は、
アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得することと、
前記異常信号を検出したときにアプリケーション層が記録した第２の異常スタック情報を読み取ることと、
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了することと、を含む。
【０００７】
場合によっては、アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得する前記ステップは、
前記アイテムが動作する過程で所定の異常信号を検出したとき、前記アイテムの動作するオペレーティングシステムのバージョン情報を確定することと、
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼びして実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成することと、を含む。
【０００８】
場合によっては、オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成する前記ステップは、
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得することと、
前記アドレス情報に基づき異常スタックデータを取得し、検出した前記異常信号の信号タイプを取得することと、
前記信号タイプと前記異常スタックデータとを組み合わせて前記第１の異常スタック情報を生成することと、を含む。
【０００９】
場合によっては、前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了する前記ステップは、
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換することと、
前記第３の異常スタック情報と前記第２の異常スタック情報とを組み合わせて前記サーバに報告し、且つ報告を完了した後、前記アイテムを終了することと、を含む。
【００１０】
また、上記の目的を達成するために、本願発明はさらに、異常スタック情報取得装置を提供する。当該装置は、記憶手段と、処理手段と、前記記憶手段に記憶されており、且つ前記処理手段で実行可能な異常スタック情報取得プログラムとを含み、前記異常スタック情報取得プログラムが前記処理手段により実行されるとき、
アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得するステップと、
前記異常信号を検出したときにアプリケーション層が記録した第２の異常スタック情報を読み取るステップと、
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了するステップと、を実現する。
【００１１】
場合によっては、アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得する前記ステップは、
前記アイテムが動作する過程で所定の異常信号を検出したとき、前記アイテムの動作するオペレーティングシステムのバージョン情報を確定することと、
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成することと、を含む。
【００１２】
場合によっては、オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成する前記ステップは、
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得することと、
前記アドレス情報に基づき異常スタックデータを取得し、検出した前記異常信号の信号タイプを取得することと、
前記信号タイプと前記異常スタックデータとを組み合わせて前記第１の異常スタック情報を生成することと、を含む。
【００１３】
場合によっては、前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了する前記ステップは、
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換することと、
前記第３の異常スタック情報と前記第２の異常スタック情報とを組み合わせて前記サーバに報告し、且つ報告を完了した後、前記アイテムを終了することと、を含む。
【００１４】
場合によっては、記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換する前記ステップは、
情報復元スクリプトを起動し、前記情報復元スクリプトに基づき、前記第１の異常スタック情報における関数名を順次前記シンボルテーブルにおける関数名と１つずつマッチングし、前記第１の異常スタック情報における関数名に対応するファイル名及び行番号を取得することと、
取得したファイル名及び行番号を元の第１の異常スタック情報に追加し、前記サーバが読み取り可能な第３の異常スタック情報を生成することと、を含む。
【００１５】
また、上記の目的を達成するために、本願発明はさらに、コンピュータ読み取り可能な記憶媒体を提供する。前記コンピュータ読み取り可能な記憶媒体に異常スタック情報取得プログラムが記憶されており、前記異常スタック情報取得プログラムが処理手段により実行されるとき、
アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得するステップと、
前記異常信号を検出したときにアプリケーション層が記録した第２の異常スタック情報を読み取るステップと、
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了するステップと、を実現する。
【発明の効果】
【００１６】
本願発明に係る異常スタック情報取得方法、装置及びコンピュータ読み取り可能な記憶媒体は、アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得し、且つ異常信号を検出したときにアプリケーション層が記録した第２の異常スタック情報を読み取り、前記ｎａｔｉｖｅ層及びアプリケーション層の異常スタック情報を組み合わせてサーバに報告し、且つ報告を完了した後、当該アイテムを終了するものである。異常を検出した後、直接アイテムを強制終了することを回避し、また予め定義した異常信号処理関数によりｎａｔｉｖｅ層の第１の異常スタック情報を含む完全な異常スタック情報をタイムリーに取得しサーバにアップロードすることができるため、異常の発生について全面的に監視し、異常スタック情報をリアルタイムに報告することができ、開発者は、アプリケーションの異常をタイムリーに発見し、異常の位置を迅速に特定しトラブルを解決することができる。
【図面の簡単な説明】
【００１７】
【図１】本願発明による異常スタック情報取得方法の第１の実施例のフローチャートである。
【図２】本願発明による異常スタック情報取得方法の第２の実施例におけるステップＳ３０の詳細を示すフローチャートである。
【図３】本願発明による異常スタック情報取得装置の好適な実施例の概略図である。
【図４】本願発明による異常スタック情報取得装置における異常スタック情報取得プログラムの機能モジュールを示す図である。
【発明を実施するための形態】
【００１８】
以下に本願発明の目的の達成、機能上の特徴及び利点について、実施例及び図面を用いてさらに説明する。
【００１９】
なお、挙げられる具体例は、本願発明の範囲を限定するためではなく、解釈の目的だけで用いられる。
【００２０】
本願発明は、異常スタック情報取得方法を提供する。図１は、本願発明による異常スタック情報取得方法の第１の実施例のフローチャートを示す。同図から分かるように、当該方法は、１つの装置により実行され、当該装置は、ソフトウェア及び／又はハードウェアで実現されてもよい。
【００２１】
本実施例では、当該異常スタック情報取得方法は、ステップＳ１０と、ステップＳ２０と、ステップＳ３０とを含む。
【００２２】
ステップＳ１０：アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得する。
【００２３】
本実施例では、アイテムとはコードからなるアプリケーションプログラムを指す。端末はサーバからアイテムをダウンロードし、且つインストールして実行することができる。アイテムが端末で動作する過程で、アイテムの動作状況についてリアルタイムに検出する。予め各種所定のタイプの異常情報を設定する。例えば、＜／ｂｒ＞
＿ＳＩＧＡＢＲＴ：プログラムの異常終了で、ａｂｏｒｔ関数を呼び出すことで生成される＜／ｂｒ＞_
＿ＳＩＧＩＬＬ：無効命令異常＜／ｂｒ＞_
＿ＳＩＧＢＵＳ：特定のハードウェア異常で、一般的にメモリへのアクセスにより引き起こされる＜／ｂｒ＞_
＿ＳＩＧＦＰＥ：算術例外で、例えば０除算、浮動小数点オーバーフローなど＜／ｂｒ＞_
＿ＳＩＧＳＥＧＶ：メモリへの不正アクセス＜／ｂｒ＞_。
【００２４】
アイテムが動作する過程で、アイテムに関連異常が発生するとき、対応する異常信号が引き起こされ、非同期事象が発生したことをプロセスに告知する。端末により検出された異常信号が所定の異常信号に該当する場合、所定の異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得する。異常信号処理関数は、呼び出しに備えて予め設定する必要がある。
【００２５】
１つの実施形態として、異常信号処理関数は、以下のコードで実現されてもよい。
＜ｐｒｅ＞＜ｃｏｄｅ＞
/* Signals to be caught. */
#define SIG_CATCH_COUNT 5
static const int native_sig_catch[SIG_CATCH_COUNT]= {SIGABRT, SIGILL, SIGBUS, SIGFPE, SIGSEGV};
/*
* 登録異常信号処理関数
*/
int sigaction_handler_init(void) {
struct sigaction sa_catch;
sa_catch.sa_sigaction = skn_signal_handler;
sa_catch.sa_flags = SA_SIGINFO;
size_t i = 0;
for (i = 0; native_sig_catch[i] != 0; i++) {
const int sig = native_sig_catch[i];
const struct sigaction *const action = &sa_catch;
if (sigaction(sig, action, NULL) != 0) {
return -1;
}
}
return 0;
}
＜／ｃｏｄｅ＞＜／ｐｒｅ＞
【００２６】
ここで、関数＿ｓｋｎ＼＿ｓｉｇｎａｌ＼＿ｈａｎｄｌｅｒ＿は異常信号を検出した後に実行する関数で、異常スタック情報の取得はこの関数において行われる。
【００２７】
ただし、端末に用いるオペレーティングシステムのバージョンがさまざまであるため、設定されている異常信号処理関数も同一ではない。このため、ステップＳ１０はさらに、
前記アイテムが動作する過程で所定の異常信号を検出したとき、前記アイテムの動作するオペレーティングシステムのバージョン情報を確定するステップと、前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成するステップと、を含んでもよい。
【００２８】
具体的には、オペレーティングシステムのバージョンが所定のバージョン未満の場合、第１の所定関数を呼び出して異常が発生するアドレス情報を取得し、ｄｌａｄｄｒ関数によりアドレス情報に対応する関数名及びｓｏライブラリ情報を取得する。オペレーティングシステムのバージョンが所定のバージョン以上の場合、ｄｌｏｐｅｎ関数により所定のパスで第２の所定関数を呼び出して異常が発生するアドレス情報を取得し、ｄｌａｄｄｒ関数によりアドレス情報に対応する関数名及びｓｏライブラリ情報を取得する。なお、第１の所定関数は、予め設定した異常信号処理関数であり、第２の所定関数は、オペレーティングシステムにより定義された関数で、ユーザが予め設定する必要がなく、異常信号を検出したとき、特定のパスで呼び出せばよい。本実施例では、異常スタック情報は主に、異常が発生する関数名及びｓｏライブラリ情報を含む。
【００２９】
以下にＡｎｄｒｏｉｄシステムを例に説明する。所定のバージョンをＡｎｄｒｏｉｄ  ５．０とし、ＡｎｄｒｏｉｄシステムはＡｎｄｒｏｉｄ  ５．０よりＡＲＴ仮想マシンを用いるため、異常情報の取得はＡｎｄｒｏｉｄ５．０以上及びＡｎｄｒｏｉｄ５．０未満において２タイプの方法を用い、すなわち、Ａｎｄｒｏｉｄ  ５．０以上はｕｎｗｉｎｄメソッド、Ａｎｄｒｏｉｄ  ５．０以下はｌｉｂｃｏｒｋｓｃｒｅｗ．ｓｏメソッドを用いる。具体的には、ｕｎｗｉｎｄメソッドを用いる際、コードにｕｎｗｉｎｄ．ｈヘッダファイルを組み入れ、＼＿Ｕｎｗｉｎｄ＼＿Ｂａｃｋｔｒａｃｅ関数により異常が発生するアドレス情報を取得した後、ｄｌａｄｄｒ関数によりアドレス情報に対応する関数名及びｓｏライブラリ情報を取得してもよい。ｌｉｂｃｏｒｋｓｃｒｅｗ．ｓｏメソッドを用いる際、上記の所定パスは、Ａｎｄｒｏｉｄ４．ｘバージョンにおける／ｓｙｓｔｅｍ／ｌｉｂ／というパスであってもよく、ｄｌｏｐｅｎ関数により対応するライブラリを開き、そしてｌｉｂｃｏｒｋｓｃｒｅｗ．ｓｏメソッドを呼び出し、当該メソッドに基づき異常が発生するアドレス情報を調べ、そして当該アドレス情報に基づき対応する関数名及びｓｏライブラリ情報を調べる。
【００３０】
好ましくは、１つの実施形態として、開発者が異常信号の具体的な情報を把握できるように、第１の異常スタック情報は検出した異常信号の信号タイプをさらに含む。
【００３１】
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成するステップは、前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得することと、前記アドレス情報に基づき異常スタックデータを取得し、検出した前記異常信号の信号タイプを取得することと、前記信号タイプと前記異常スタックデータとを組み合わせて前記第１の異常スタック情報を生成することと、を含む。
【００３２】
異常が発生するアドレス情報に基づき、対応する異常スタックデータを取得した後、異常信号を検出したときに記録した当該異常信号の前記信号タイプを取得し、当該信号タイプと前記異常スタックデータとを組み合わせて第１の異常スタック情報を生成し、異常スタックデータは、上記調べた異常が発生する関数名及びｓｏライブラリ情報を含む。なお、第１の異常スタック情報はｎａｔｉｖｅ層で取得してローカルに記憶された後、ｎａｔｉｖｅ層がアプリケーション層に告知メッセージを送信し、アプリケーション層に読み取るように指示してもよい。Ａｎｄｒｏｉｄシステムの場合、アプリケーション層は、すなわちＪａｖａ（登録商標）層である。ｎａｔｉｖｅ層で信号タイプと異常スタックデータとを組み合わせるとき、アプリケーション層と区別するために、所定のセパレータを用いて分割する。
【００３３】
ステップＳ２０：前記異常信号を検出したときにアプリケーション層が記録した第２の異常スタック情報を読み取る。
【００３４】
ステップＳ３０：前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了する。
【００３５】
通常、端末が異常信号を検出したときに、そのアプリケーション層が異常スタック情報を記録する。一般的にシステムの設定に基づき一定のパスで記憶し、このため、異常信号を検出したときに、直接設定されたパスで、記憶された異常情報を読み取り、上記第２の異常スタック情報としてもよい。
【００３６】
取得したｎａｔｉｖｅ層の第１の異常スタック情報と、読み取って記憶されたアプリケーション層の第２の異常スタック情報とに対してカプセル化処理を行い、且つサーバに報告することにより、開発者がタイムリーにアプリケーションプログラムにおける異常が発生するコードの位置を特定して分析し、そしてタイムリーにアプリケーションプログラムを保守して更新することができる。報告を完了した後、当該アイテムを終了する。
【００３７】
従来技術によるｎａｔｉｖｅ層の異常スタックの取得方法は通常、コード量が大きく（例えばＧｏｏｇｌｅ  ＢｒｅａｋＰａｄ）、あるいは関連スタック情報を読み取るにはシステムのｒｏｏｔ権限が必要で（例えばｔｏｍｂｓｔｏｎｅ）、しかもそのプロセスがかなり複雑なものである。
【００３８】
本実施例に係る異常スタック情報取得方法は、アイテムが動作する過程で所定の異常信号を検出したとき、比較的小さなコード量で、予め定義した関数によりｎａｔｉｖｅ層の異常スタック情報を取得し、またｒｏｏｔ権限を用いず、異常信号を検出したときにアプリケーション層が記録した第２の異常スタック情報を読み取り、２つの異常スタック情報をカプセル化してサーバにアップロードし、そしてアプリケーションを終了するものである。異常を検出した後、直接アプリケーションを強制終了することを回避する。このため、ｎａｔｉｖｅ層を含む完全な異常スタック情報をタイムリーに取得してサーバにアップロードすることができ、異常の発生について全面的に監視し、異常スタック情報をリアルタイムに報告することができ、開発者は、アプリケーションの異常をタイムリーに発見し、迅速に位置を特定してトラブルを解決することができる。
【００３９】
第１の実施例に基づき、本願発明に係る異常スタック情報取得方法の第２の実施例を提供する。図２に示すように、本実施例では、ステップＳ３０はさらに、ステップＳ３１と、ステップＳ３２とを含む。
【００４０】
ステップＳ３１：記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換する。
【００４１】
ステップＳ３２：前記第３の異常スタック情報と前記第２の異常スタック情報とを組み合わせて前記サーバに報告し、且つ報告を完了した後、前記アイテムを終了する。
【００４２】
通常、上記の方法で取得した第１の異常スタック情報は、開発者にとって可読性が低いもので、第１の異常情報からその関数名くらいは知ることができるが、異常が存在するファイルの名称及び存在する行の番号は直接知ることができない。その可読性を高めるために、第１の異常スタック情報を取得した後、当該アプリケーションとマッチングするシンボルテーブルにより第１の異常スタック情報に対して復元処理を行うことにより、関数名、当該関数名に対応するファイル名及び行番号を含む第３の異常スタック情報を得る。なお、シンボルテーブルは、言語トランスレータ用のデータ構造で、シンボルテーブルでは、プログラムソースコードにおける各識別子がいずれもその宣言、又は使用情報と結び付けられる。本実施例では、アイテムのシンボルテーブルにおける各関数名にはいずれも対応するファイル名及び存在する行の番号がある。アイテムのバージョンごとに１つのシンボルテーブルと対応する。アイテムがアップグレードされた場合、そのシンボルテーブルを更新する必要がある。
【００４３】
好ましくは、他の実施例では、アイテム情報の安全性を高めるために、シンボルテーブルをサーバに格納してもよい。サーバが端末の報告した異常スタック情報を受信した後、記憶されているシンボルテーブルに基づき第１の異常スタック情報に対して復元処理を行う。
【００４４】
本実施例では、予め情報復元スクリプトを設定する。第１の異常スタック情報を取得した後、情報復元スクリプトを起動し、前記情報復元スクリプトに基づき、前記第１の異常スタック情報における関数名を順次前記シンボルテーブルにおける関数名と１つずつマッチングし、前記第１の異常スタック情報における関数名に対応するファイル名及び行番号を取得し、そして取得したファイル名及び行番号を元の第１の異常スタック情報に追加し、前記サーバが読み取り可能な第３の異常スタック情報を生成する。
【００４５】
前記情報復元スクリプトは、以下であってもよい。
2019525275.tif 000003
【００４６】
ここで、ｃｒａｓｈ．ｔｘｔは、復元していない異常情報、すなわち第１の異常スタック情報で、ｓｙｍｂｏｌ．ｔｘｔは、シンボルテーブルで、ｒｅｓｕｌｔ．ｔｘｔは、復元済みの異常情報、すなわち、第３の異常スタック情報である。
【００４７】
例えば、取得した異常情報は、以下である場合、
＜ｃｏｄｅ＞＜ｐｒｅ＞
＼_Z2aav /data/app/com.pingan.pad_demo-2/lib/arm/libcrash.so
＜／ｃｏｄｅ＞＜／ｐｒｅ＞
上記の情報復元スクリプトにより復元された異常情報は、以下となる。
＜ｃｏｄｅ＞＜ｐｒｅ＞
Z2aav
/Users/duyuan797/Workspace/sky-eye/sky-eye/src/main/cpp/./src/skncrash.cpp:72 /data/app/com.pingan.pad_demo-2/lib/arm/libcrash.so
＜／ｃｏｄｅ＞＜／ｐｒｅ＞
【００４８】
本実施例に係る方法は、取得したｎａｔｉｖｅ層の第１の異常スタック情報に対して復元処理を行うことにより、サーバにおけるその可読性を高め、開発者はより完全な異常情報を取得しやすくなる。
【００４９】
図３は、本願発明による異常スタック情報取得装置の好適な実施例の概略図を示す。
【００５０】
本実施例では、異常スタック情報取得装置は、スマートフォン、タブレットＰＣ、電子ブックリーダー、ＭＰ３（Ｍｏｖｉｎｇ  Ｐｉｃｔｕｒｅ  Ｅｘｐｅｒｔｓ  Ｇｒｏｕｐ  Ａｕｄｉｏ  Ｌａｙｅｒ  ＩＩＩ、ムービングピクチャーエクスパーツグループオーディオレイヤー３）プレイヤー、ＭＰ４（Ｍｏｖｉｎｇ  Ｐｉｃｔｕｒｅ  Ｅｘｐｅｒｔｓ  Ｇｒｏｕｐ  Ａｕｄｉｏ  Ｌａｙｅｒ  ＩＶ、ムービングピクチャーエクスパーツグループオーディオレイヤー４）プレイヤー、ポータブルＰＣなど表示機能を備える携帯型端末機器であってもよい。
【００５１】
当該異常スタック情報装置は、記憶手段１１と、処理手段１２と、通信バス１３と、ネットワークインタフェース１４とを含む。通信バス１３は、これらの要素間の接続と通信を実現する。ネットワークインタフェース１４は、場合によっては、標準の有線インタフェース、無線インタフェース（例えば、ＷＩ−ＦＩインタフェース）を含んでもよい。記憶手段１１は、高速ＲＡＭメモリでもよいが、又は不揮発性メモリ（ｎｏｎ−ｖｏｌａｔｉｌｅ  ｍｅｍｏｒｙ）、例えば磁気ディスクメモリであってもよい。
【００５２】
いくつかの実施例では、記憶手段１１は、異常スタック情報取得装置内部の記憶手段、例えば、当該装置のハードディスクであってもよい。また、他の実施例では、当該装置外部の記憶手段、例えば、当該装置に搭載された外付けハードディスク、スマートメディアカード（Ｓｍａｒｔ  Ｍｅｄｉａ(登録商標)  Ｃａｒｄ、ＳＭＣ）、セキュアデジタル（Ｓｅｃｕｒｅ  Ｄｉｇｉｔａｌ、ＳＤ）カード、フラッシュカード（Ｆｌａｓｈ  Ｃａｒｄ）などであってもよい。又は、記憶手段１１は、異常スタック情報取得装置内部の記憶ユニット及び外部の記憶デバイスの両方を含んでもよい。記憶手段１１は、当該装置にインストールされるアプリケーションソフトウェア及び各種データ、例えば、異常スタック情報取得プログラムのコードなどを記憶し、あるいはすでに出力された又は出力しようとするデータを一時記憶する。
【００５３】
いくつかの実施例では、処理手段１２は、例えば、中央処理装置（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ、ＣＰＵ）、マイクロプロセッサ、又はその他のデータ処理チップであってもよい。記憶手段１１に記憶されているプログラムコードを実行するか、又はデータを処理し、例えば、異常スタック情報取得プログラムなどを実行する。
【００５４】
図３では、要素１１〜１４と、異常スタック情報取得プログラムとを備える異常スタック情報取得装置を示しているが、必ずしも示されたすべての要素で実施するとは限らず、代替案としてより多い又はより少ない数の要素で実施してもよい。
【００５５】
場合によっては、当該装置は、ユーザインタフェースをさらに含んでもよく、ユーザインタフェースは、ディスプレイ（Ｄｉｓｐｌａｙ）、入力手段、例えばキーボード（Ｋｅｙｂｏａｒｄ）を含んでもよい。また場合によっては、ユーザインタフェースは、標準の有線インタフェース、無線インタフェースを含んでもよい。いくつかの実施例では、ディスプレイは、例えば、ＬＥＤディスプレイ、液晶ディスプレイ、タッチコントロール液晶ディスプレイ、又はＯＬＥＤ（Ｏｒｇａｎｉｃ  Ｌｉｇｈｔ−Ｅｍｉｔｔｉｎｇ  Ｄｉｏｄｅ、有機発光ダイオード）パネルであってもよい。異常スタック情報取得装置で処理される情報や、グラフィカルユーザインタフェースなどを表示する。
【００５６】
場合によっては、当該装置は、カメラ、ＲＦ（Ｒａｄｉｏ  Ｆｒｅｑｕｅｎｃｙ、高周波）回路、センサ、音声処理回路、ＷｉＦｉモジュールなどを含んでもよい。センサとしては、例えば光センサ、モーションセンサ、又はその他のセンサが挙げられる。このうち、光センサは、環境光センサ及び近接センサを含んでもよい。当該装置が移動端末の場合、環境光センサは、環境光の明るさに基づきディスプレイの輝度を調整し、接近センサは、移動端末が耳の近くに移動すると、ディスプレイ及び／又はバックライトをオフにすることができる。モーションセンサとして、例えば重力加速度センサは、各方向（一般的には３軸）における加速度の大きさを検出し、静止状態では重力の大きさ及び方向を検出することができ、移動端末の姿勢を認識するアプリケーション（例えば、横／縦画面表示の切り替え、当該機能が必要なゲーム、磁気計姿勢の校正）、振動認識に関連する機能（例えば歩数計、叩き動作）などに用いる。当然ながら、移動端末にジャイロスコープ、気圧計、湿度計、温度計、赤外線センサなどその他のセンサを配置してもよく、ここでは説明を省略する。
【００５７】
図３に示す装置の実施例では、コンピュータの記憶媒体である記憶手段１１に、オペレーティングシステム、及び異常スタック情報取得プログラムが記憶されてもよい。ネットワークインタフェース１４は主に、サーバと接続し、サーバとデータ通信を行うために用いる。処理手段１２は記憶手段１１に記憶されている異常スタック情報取得プログラムを実行するとき、
アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得するステップと、
前記異常信号を検出したときにアプリケーション層が記録した第２の異常スタック情報を読み取るステップと、
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了するステップと、を実現する。
【００５８】
本実施例では、アイテムとはコードからなるアプリケーションプログラムを指す。端末はサーバからアイテムをダウンロードし、且つインストールして実行することができる。アイテムが端末で動作する過程で、アイテムの動作状況についてリアルタイムに検出する。予め各種所定のタイプの異常情報を設定する。例えば、＜／ｂｒ＞
＿ＳＩＧＡＢＲＴ：プログラムの異常終了で、ａｂｏｒｔ関数を呼び出すことで生成される＜／ｂｒ＞_
＿ＳＩＧＩＬＬ：無効命令異常＜／ｂｒ＞_
＿ＳＩＧＢＵＳ：特定のハードウェア異常で、一般的にメモリへのアクセスにより引き起こされる＜／ｂｒ＞_
＿ＳＩＧＦＰＥ：算術例外で、例えば０除算、浮動小数点オーバーフローなど＜／ｂｒ＞_
＿ＳＩＧＳＥＧＶ：メモリへの不正アクセス＜／ｂｒ＞_。
【００５９】
アイテムが動作する過程で、アイテムに関連異常が発生するとき、対応する異常信号が引き起こされ、非同期事象が発生したことをプロセスに告知する。端末により検出された異常信号が所定の異常信号に該当する場合、所定の異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得する。異常信号処理関数は、呼び出しに備えて予め設定する必要がある。
【００６０】
１つの実施形態として、異常信号処理関数は、以下のコードで実現されてもよい。
＜ｐｒｅ＞＜ｃｏｄｅ＞
/* Signals to be caught. */
#define SIG_CATCH_COUNT 5
static const int native_sig_catch[SIG_CATCH_COUNT]= {SIGABRT, SIGILL, SIGBUS, SIGFPE, SIGSEGV};
/*
* 登録異常信号処理関数
*/
int sigaction_handler_init(void) {
struct sigaction sa_catch;
sa_catch.sa_sigaction = skn_signal_handler;
sa_catch.sa_flags = SA_SIGINFO;
size_t i = 0;
for (i = 0; native_sig_catch[i] != 0; i++) {
const int sig = native_sig_catch[i];
const struct sigaction *const action = &sa_catch;
if (sigaction(sig, action, NULL) != 0) {
return -1;
}
}
return 0;
}
＜／ｃｏｄｅ＞＜／ｐｒｅ＞
【００６１】
ここで、関数＿ｓｋｎ＼＿ｓｉｇｎａｌ＼＿ｈａｎｄｌｅｒ＿は異常信号を検出した後に実行する関数で、異常スタック情報の取得はこの関数において行われる。
【００６２】
ただし、端末に用いるオペレーティングシステムのバージョンがさまざまであるため、設定されている異常信号処理関数も同一ではない。このため、異常スタック情報取得プログラムが処理手段１２により実行されるとき、さらに
前記アイテムが動作する過程で所定の異常信号を検出したとき、前記アイテムの動作するオペレーティングシステムのバージョン情報を確定するステップと、
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成するステップと、を実現する。
【００６３】
具体的には、異常スタック情報取得プログラムが処理手段１２により実行されるとき、さらに、
オペレーティングシステムのバージョンが所定のバージョン未満の場合、第１の所定関数を呼び出して異常が発生するアドレス情報を取得し、ｄｌａｄｄｒ関数によりアドレス情報に対応する関数名及びｓｏライブラリ情報を取得し、あるいは、オペレーティングシステムのバージョンが所定のバージョン以上の場合、ｄｌｏｐｅｎ関数により所定のパスで第２の所定関数を呼び出して異常が発生するアドレス情報を取得し、ｄｌａｄｄｒ関数によりアドレス情報に対応する関数名及びｓｏライブラリ情報を取得するステップを実現する。
【００６４】
なお、第１の所定関数は、予め設定した異常信号処理関数であり、第２の所定関数は、オペレーティングシステムにより定義された関数で、ユーザが予め設定する必要がなく、異常信号を検出したとき、特定のパスで呼び出せばよい。本実施例では、異常スタック情報は主に、異常が発生する関数名及びｓｏライブラリ情報を含む。
【００６５】
以下にＡｎｄｒｏｉｄシステムを例に説明する。所定のバージョンをＡｎｄｒｏｉｄ  ５．０とし、ＡｎｄｒｏｉｄシステムはＡｎｄｒｏｉｄ  ５．０よりＡＲＴ仮想マシンを用いるため、異常情報の取得はＡｎｄｒｏｉｄ５．０以上及びＡｎｄｒｏｉｄ５．０未満において２タイプの方法を用い、すなわち、Ａｎｄｒｏｉｄ  ５．０以上はｕｎｗｉｎｄメソッド、Ａｎｄｒｏｉｄ  ５．０以下はｌｉｂｃｏｒｋｓｃｒｅｗ．ｓｏメソッドを用いる。具体的には、ｕｎｗｉｎｄメソッドを用いる際、コードにｕｎｗｉｎｄ．ｈヘッダファイルを組み入れ、＼＿Ｕｎｗｉｎｄ＼＿Ｂａｃｋｔｒａｃｅ関数により異常が発生するアドレス情報を取得した後、ｄｌａｄｄｒ関数によりアドレス情報に対応する関数名及びｓｏライブラリ情報を取得してもよい。ｌｉｂｃｏｒｋｓｃｒｅｗ．ｓｏメソッドを用いる際、上記の所定パスは、Ａｎｄｒｏｉｄ４．ｘバージョンにおける／ｓｙｓｔｅｍ／ｌｉｂ／というパスであってもよく、ｄｌｏｐｅｎ関数により対応するライブラリを開き、そしてｌｉｂｃｏｒｋｓｃｒｅｗ．ｓｏメソッドを呼び出し、当該メソッドに基づき異常が発生するアドレス情報を調べ、そして当該アドレス情報に基づき対応する関数名及びｓｏライブラリ情報を調べる。
【００６６】
好ましくは、１つの実施形態として、開発者が異常信号の具体的な情報を把握できるように、第１の異常スタック情報は検出した異常信号の信号タイプをさらに含む。
【００６７】
異常スタック情報取得プログラムが処理手段１２により実行されるとき、さらに以下のステップを実現する。
【００６８】
つまり、前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成するステップは、前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得することと、前記アドレス情報に基づき異常スタックデータを取得し、検出した前記異常信号の信号タイプを取得することと、前記信号タイプと前記異常スタックデータとを組み合わせて前記第１の異常スタック情報を生成することと、を含む。
【００６９】
異常が発生するアドレス情報に基づき、対応する異常スタックデータを取得した後、異常信号を検出したときに記録した当該異常信号の前記信号タイプを取得し、当該信号タイプと前記異常スタックデータとを組み合わせて第１の異常スタック情報を生成し、異常スタックデータは、上記調べた異常が発生する関数名及びｓｏライブラリ情報を含む。なお、第１の異常スタック情報はｎａｔｉｖｅ層で取得してローカルに記憶された後、ｎａｔｉｖｅ層がアプリケーション層に告知メッセージを送信し、アプリケーション層に読み取るように指示してもよい。Ａｎｄｒｏｉｄシステムの場合、アプリケーション層は、すなわち、Ｊａｖａ（登録商標）層である。ｎａｔｉｖｅ層で信号タイプと異常スタックデータとを組み合わせるとき、アプリケーション層と区別するために、所定のセパレータを用いて分割する。
【００７０】
通常、端末が異常信号を検出したときに、そのアプリケーション層が異常スタック情報を記録する。一般的にシステムの設定に基づき一定のパスで記憶し、このため、異常信号を検出したときに、直接設定されたパスで、記憶された異常情報を読み取り、上記第２の異常スタック情報としてもよい。
【００７１】
取得したｎａｔｉｖｅ層の第１の異常スタック情報と、読み取って記憶されたアプリケーション層の第２の異常スタック情報とに対してカプセル化処理を行い、且つサーバに報告することにより、開発者がタイムリーにアプリケーションプログラムにおける異常が発生するコードの位置を特定して分析し、そしてタイムリーにアプリケーションプログラムを保守して更新することができる。報告を完了した後、当該アイテムを終了する。
【００７２】
従来技術によるｎａｔｉｖｅ層の異常スタックの取得方法は、通常、コード量が大きく（例えばＧｏｏｇｌｅ  ＢｒｅａｋＰａｄ）、あるいは関連スタック情報を読み取るにはシステムのｒｏｏｔ権限が必要で（例えばｔｏｍｂｓｔｏｎｅ）、しかもそのプロセスがかなり複雑なものである。
【００７３】
本実施例に係る異常スタック情報取得装置は、アイテムが動作する過程で所定の異常信号を検出したとき、比較的小さなコード量で、予め定義した関数によりｎａｔｉｖｅ層の異常スタック情報を取得し、またｒｏｏｔ権限を用いず、異常信号を検出したときにアプリケーション層が記録した第２の異常スタック情報を読み取り、２つの異常スタック情報をカプセル化してサーバにアップロードし、そしてアプリケーションを終了するものである。異常を検出した後、直接アプリケーションを強制終了することを回避する。このため、ｎａｔｉｖｅ層を含む完全な異常スタック情報をタイムリーに取得してサーバにアップロードすることができ、異常の発生について全面的に監視し、異常スタック情報をリアルタイムに報告することができ、開発者は、アプリケーションの異常をタイムリーに発見し、迅速に位置を特定してトラブルを解決することができる。
【００７４】
第１の実施例に基づき、本願発明に係る異常スタック情報取得装置の第２の実施例を提供する。本実施例では、異常スタック情報取得プログラムが処理手段１２により実行されるとき、さらに
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換するステップと、
前記第３の異常スタック情報と前記第２の異常スタック情報とを組み合わせて前記サーバに報告し、且つ報告を完了した後、前記アイテムを終了するステップと、を実現する。
【００７５】
通常、上記の方法で取得した第１の異常スタック情報は、開発者にとって可読性が低いもので、第１の異常情報からその関数名くらいは知ることができるが、異常が存在するファイルの名称及び存在する行の番号は直接知ることができない。その可読性を高めるために、第１の異常スタック情報を取得した後、当該アプリケーションとマッチングするシンボルテーブルにより第１の異常スタック情報に対して復元処理を行うことにより、関数名、当該関数名に対応するファイル名及び行番号を含む第３の異常スタック情報を得る。なお、シンボルテーブルは、言語トランスレータ用のデータ構造で、シンボルテーブルでは、プログラムソースコードにおける各識別子がいずれもその宣言、又は使用情報と結び付けられる。本実施例では、アイテムのシンボルテーブルにおける各関数名にはいずれも対応するファイル名及び存在する行の番号がある。アイテムのバージョンごとに１つのシンボルテーブルと対応する。アイテムがアップグレードされた場合、そのシンボルテーブルを更新する必要がある。
【００７６】
好ましくは、他の実施例では、アイテム情報の安全性を高めるために、シンボルテーブルをサーバに格納してもよい。サーバが端末の報告した異常スタック情報を受信した後、記憶されているシンボルテーブルに基づき第１の異常スタック情報に対して復元処理を行う。
【００７７】
本実施例では、予め情報復元スクリプトを設定する。第１の異常スタック情報を取得した後、処理手段１２が異常スタック情報取得プログラムを実行し、
情報復元スクリプトを起動し、前記情報復元スクリプトに基づき、前記第１の異常スタック情報における関数名を順次前記シンボルテーブルにおける関数名と１つずつマッチングし、前記第１の異常スタック情報における関数名に対応するファイル名及び行番号を取得するステップと、取得したファイル名及び行番号を元の第１の異常スタック情報に追加し、前記サーバが読み取り可能な第３の異常スタック情報を生成するステップと、を実現する。
【００７８】
前記情報復元スクリプトは、以下であってもよい。
2019525275.tif 000004
【００７９】
ここで、ｃｒａｓｈ．ｔｘｔは、復元していない異常情報、すなわち第１の異常スタック情報で、ｓｙｍｂｏｌ．ｔｘｔは、シンボルテーブルで、ｒｅｓｕｌｔ．ｔｘｔは、復元済みの異常情報、すなわち第３の異常スタック情報である。
【００８０】
例えば、取得した異常情報が、以下である場合、
＜ｃｏｄｅ＞＜ｐｒｅ＞
＼_Z2aav /data/app/com.pingan.pad_demo-2/lib/arm/libcrash.so
＜／ｃｏｄｅ＞＜／ｐｒｅ＞
上記の情報復元スクリプトにより復元された異常情報は、以下となる。
＜ｃｏｄｅ＞＜ｐｒｅ＞
Z2aav
/Users/duyuan797/Workspace/sky-eye/sky-eye/src/main/cpp/./src/skncrash.cpp:72 /data/app/com.pingan.pad_demo-2/lib/arm/libcrash.so
＜／ｃｏｄｅ＞＜／ｐｒｅ＞
【００８１】
本実施例に係る装置は、異常スタック情報取得プログラムで取得したｎａｔｉｖｅ層の第１の異常スタック情報に対して復元処理を行うことにより、サーバにおけるその可読性を高め、開発者はより完全な異常情報を取得しやすくなる。
【００８２】
場合によっては、他の実施例では、異常スタック情報取得プログラムは、１つ又は複数のモジュールに分割されてもよい。これらのモジュールは、記憶手段１１に記憶されており、且つ１つ又は複数の処理手段（本実施例では処理手段１２）により実行されることで、本願発明を実現する。本願発明に用いるモジュールという用語は、異常スタック情報取得装置における異常スタック情報取得プログラムの実行プロセスの説明に好適で、特定の機能を実現可能な一連のコンピュータプログラムセグメントを指すものである。
【００８３】
例えば、一実施例では、異常スタック情報取得プログラムは、取得モジュール１０と、報告モジュール２０とに分割されてもよい。図４は、本願発明による異常スタック情報取得装置における異常スタック情報取得プログラムの機能モジュールを示す。
【００８４】
図４によると、取得モジュール１０は、アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得し、そして前記異常信号を検出したときにアプリケーション層が記録した第２の異常スタック情報を読み取る。
【００８５】
報告モジュール２０は、前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了する。
【００８６】
また、本実施例はさらに、コンピュータ読み取り可能な記憶媒体を提供する。前記コンピュータ読み取り可能な記憶媒体に、異常スタック情報取得プログラムが記憶されており、前記異常スタック情報取得プログラムが処理手段により実行されるとき、
アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得する動作と、
前記異常信号を検出したときにアプリケーション層が記録した第２の異常スタック情報を読み取る動作と、
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了する動作と、を実現する。
【００８７】
さらに、前記異常スタック情報取得プログラムが処理手段により実行されるとき、
前記アイテムが動作する過程で所定の異常信号を検出したとき、前記アイテムの動作するオペレーティングシステムのバージョン情報を確定する動作と、
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成する動作と、を実現する。
【００８８】
さらに、前記異常スタック情報取得プログラムが処理手段により実行されるとき、
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得する動作と、
前記アドレス情報に基づき異常スタックデータを取得し、検出した前記異常信号の信号タイプを取得する動作と、
前記信号タイプと前記異常スタックデータとを組み合わせて前記第１の異常スタック情報を生成す動作と、を実現する。
【００８９】
さらに、前記異常スタック情報取得プログラムが処理手段により実行されるとき、
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換する動作と、
前記第３の異常スタック情報と前記第２の異常スタック情報とを組み合わせて前記サーバに報告し、且つ報告を完了した後、前記アイテムを終了する動作と、を実現する。
【００９０】
本明細書における用語「含む」、又はこれに類する他の用語は、非排他的な包括を意味し、これにより、一連の要素を含むプロセス、方法、物品、もしくは装置は、これらの要素だけでなく、明記していない他の要素も含み、又はこのようなプロセス、方法、物品、もしくは装置に固有の要素をさらに含む。よって、特段の限定がない限り、文言「〜を含む」などにより限定される要素は、当該要素を含むプロセス、方法、物品又は装置にさらに同一の要素が存在する場合を除外しない。
【００９１】
本発明の実施例に付与した番号は、記載上の便宜を図るものに過ぎず、実施例の優劣を示すものではない。
【００９２】
当業者は、実施形態に関する上記の説明により、上記の実施例に係る方法は、ソフトウェアと、必要な汎用ハードウェアプラットフォームとを組み合わせる方式でも、ハードウェアでも実現できるが、多くの場合には、前者がより好ましい実施形態となることを理解できるであろう。これにより、本願に係る発明の趣旨又は従来技術について改良する部分を、ソフトウェア製品の形で表現することができ、当該コンピュータソフトウェア製品は、上記した記憶媒体（例えば、ＲＯＭ／ＲＡＭ、磁気ディスク、ＣＤＲＯＭ）に記憶されており、且つ、端末機器（例えば、携帯電話、コンピュータ、サーバ、空調装置、又はネットワーク機器）により本発明の各実施例に記載の方法を実行するための複数のコマンドを含む。
【００９３】
上記の内容は、本願発明の好適な実施例を記載するものに過ぎず、これをもって特許請求の範囲を限定するものではなく、本明細書及び図面の内容に基づく均等な構造変更、又はその他の関連する技術分野への直接的もしくは間接的な適用は、いずれも本願発明の特許保護の範囲に含まれるものとする。
【図１】
2019525275.tif 000005
【図２】
2019525275.tif 000006
【図３】
2019525275.tif 000007
【図４】
2019525275.tif 000008
【手続補正書】
【提出日】平成30年10月11日(2018.10.11)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
異常スタック情報取得方法であって、
アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得することと、
前記異常信号を検出したときにアプリケーション層が記録した第２の異常スタック情報を読み取ることと、
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了することと、を含むことを特徴とする異常スタック情報取得方法。
【請求項２】
アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得する前記ステップは、
前記アイテムが動作する過程で所定の異常信号を検出したとき、前記アイテムの動作するオペレーティングシステムのバージョン情報を確定することと
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼びして実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成することと、を含むことを特徴とする請求項１に記載の異常スタック情報取得方法。
【請求項３】
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成する前記ステップは、
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得することと、
前記アドレス情報に基づき異常スタックデータを取得し、検出した前記異常信号の信号タイプを取得することと、
前記信号タイプと前記異常スタックデータとを組み合わせて前記第１の異常スタック情報を生成することと、を含むことを特徴とする請求項２に記載の異常スタック情報取得方法。
【請求項４】
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了する前記ステップは、
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換することと、
前記第３の異常スタック情報と前記第２の異常スタック情報とを組み合わせて前記サーバに報告し、且つ報告を完了した後、前記アイテムを終了することと、を含むことを特徴とする請求項２または３に記載の異常スタック情報取得方法。
【請求項５】
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換する前記ステップは、
情報復元スクリプトを起動し、前記情報復元スクリプトに基づき、前記第１の異常スタック情報における関数名を順次前記シンボルテーブルにおける関数名と１つずつマッチングし、前記第１の異常スタック情報における関数名に対応するファイル名及び行番号を取得することと、
取得したファイル名及び行番号を元の第１の異常スタック情報に追加し、前記サーバが読み取り可能な第３の異常スタック情報を生成することと、を含むことを特徴とする請求項３に記載の異常スタック情報取得方法。
【請求項６】
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換する前記ステップは、
情報復元スクリプトを起動し、前記情報復元スクリプトに基づき、前記第１の異常スタック情報における関数名を順次前記シンボルテーブルにおける関数名と１つずつマッチングし、前記第１の異常スタック情報における関数名に対応するファイル名及び行番号を取得することと、
取得したファイル名及び行番号を元の第１の異常スタック情報に追加し、前記サーバが読み取り可能な第３の異常スタック情報を生成することと、を含むことを特徴とする請求項４に記載の異常スタック情報取得方法。
【請求項７】
異常スタック情報取得装置であって、
記憶手段と、処理手段と、前記記憶手段に記憶されており、且つ前記処理手段で動作可能な異常スタック情報取得プログラムとを含み、前記異常スタック情報取得プログラムが前記処理手段により実行されるとき、
アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得するステップと、
前記異常信号を検出したときにアプリケーション層が記録した第２の異常スタック情報を読み取るステップと、
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了するステップと、を実現することを特徴とする異常スタック情報取得装置。
【請求項８】
アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得する前記ステップは、
前記アイテムが動作する過程で所定の異常信号を検出したとき、前記アイテムの動作するオペレーティングシステムのバージョン情報を確定することと
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼びして実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成することと、を含むことを特徴とする請求項７に記載の異常スタック情報取得装置。
【請求項９】
オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得し、且つ前記アドレス情報に基づき第１の異常スタック情報を生成する前記ステップは、
前記オペレーティングシステムのバージョン情報に対応する異常信号処理関数を呼び出して実行し、異常が発生するアドレス情報を取得することと、
前記アドレス情報に基づき異常スタックデータを取得し、検出した前記異常信号の信号タイプを取得することと、
前記信号タイプと前記異常スタックデータとを組み合わせて前記第１の異常スタック情報を生成することと、を含むことを特徴とする請求項７に記載の異常スタック情報取得装置。
【請求項１０】
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了する前記ステップは、
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換することと、
前記第３の異常スタック情報と前記第２の異常スタック情報とを組み合わせて前記サーバに報告し、且つ報告を完了した後、前記アイテムを終了することと、を含むことを特徴とする請求項８または９に記載の異常スタック情報取得装置。
【請求項１１】
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換する前記ステップは、
情報復元スクリプトを起動し、前記情報復元スクリプトに基づき、前記第１の異常スタック情報における関数名を順次前記シンボルテーブルにおける関数名と１つずつマッチングし、前記第１の異常スタック情報における関数名に対応するファイル名及び行番号を取得することと、
取得したファイル名及び行番号を元の第１の異常スタック情報に追加し、前記サーバが読み取り可能な第３の異常スタック情報を生成することと、含むことを特徴とする請求項９に記載の異常スタック情報取得装置。
【請求項１２】
記憶されているシンボルテーブルを読み取り、且つ前記シンボルテーブルに基づき、取得した第１の異常スタック情報に対して復元処理を行うことにより、前記第１の異常スタック情報を前記サーバが読み取り可能な第３の異常スタック情報に変換する前記ステップは、
情報復元スクリプトを起動し、前記情報復元スクリプトに基づき、前記第１の異常スタック情報における関数名を順次前記シンボルテーブルにおける関数名と１つずつマッチングし、前記第１の異常スタック情報における関数名に対応するファイル名及び行番号を取得することと、
取得したファイル名及び行番号を元の第１の異常スタック情報に追加し、前記サーバが読み取り可能な第３の異常スタック情報を生成することと、を含むことを特徴とする請求項１０に記載の異常スタック情報取得装置。
【請求項１３】
コンピュータ読み取り可能な記憶媒体であって、
当該媒体に異常スタック情報取得プログラムが記憶されており、前記異常スタック情報取得プログラムが処理手段により実行されるとき、
アイテムが動作する過程で所定の異常信号を検出したとき、異常信号処理関数を呼び出して実行することにより、ｎａｔｉｖｅ層の第１の異常スタック情報を取得するステップと、
前記異常信号を検出したときにアプリケーション層が記録した第２の異常スタック情報を読み取るステップと、
前記第１の異常スタック情報と前記第２の異常スタック情報とを組み合わせてサーバに報告し、且つ報告を完了した後、前記アイテムを終了するステップと、を実現することを特徴とするコンピュータ読み取り可能な記憶媒体。
【国際調査報告】
2019525275.tif 000009
2019525275.tif 000010
2019525275.tif 000011
2019525275.tif 000012