(57)【要約】【課題】トレース機能を備えていない画像形成装置に対しトレース機能を容易に付加する。【解決手段】置換部４１により、機械語プログラム（アプリケーション）３０に含まれる、サブルーチンからのリターン命令を、ロギング部４２へのジャンプ命令で置換する。アプリケーションを起動させると、ロギング部４２により、置換されたジャンプ命令を含むサブルーチンからの戻りアドレスが取得され、該戻りアドレスの直前に格納されているサブルーチンコール命令及び引数に関する情報が、ライトポインタ４４１が示すＤＲＡＭ内のアドレスに格納され、ライトポインタ４４１の内容が、次に格納すべきアドレスに更新され、次いでリターン命令ｒｅｔ実行により命令ポインタが該戻りアドレスに変更される。ログデータは、圧縮され、暗号化され、ログ送信部５１により電子メールでエラー解析者に送信される。次いで置換部４１の逆置換部が起動されて、アプリケーションプログラム３０が元の状態に戻る。【選択図】図１
2008021066.tif 000002
【特許請求の範囲】
【請求項１】
画像形成装置の記憶手段に格納された機械語プログラムにトレース機能を付加する画像形成装置用トレース機能付加プログラムであって、該記憶手段に格納される置換プログラムとロギングプログラムとを有し、
該置換プログラムは該画像形成装置のプロセッサ又は他のプロセッサに対し、該機械語プログラムに含まれる、サブルーチンからのリターン命令を、語長が該リターン命令以下の、該ロギングプログラムへのジャンプ命令で置換させることを特徴とし、
該ロギングプログラムは該画像形成装置の該プロセッサに対し、
置換されたジャンプ命令を含むサブルーチンからの戻りアドレスを取得させ、
ライトポインタが示すアドレスに基づいて、該戻りアドレスの直前に格納されているサブルーチンコール命令に関する情報を該記憶手段に格納させ、該ライトポインタの内容を、次に格納すべきアドレスに更新させ、
該プロセッサの命令ポインタを該戻りアドレスに変更させる、
ステップを有することを特徴とする画像形成装置用トレース機能付加プログラム。
【請求項２】
該リターン命令のアドレスが複数記述されたアドレスデータをさらに有し、
該置換プログラムは該画像形成装置のプロセッサ又は該他のプロセッサに対し、該アドレスデータに含まれるアドレスのリターン命令を該ジャンプ命令で置換させる、
ことを特徴とする請求項１に記載の画像形成装置用トレース機能付加プログラム。
【請求項３】
該機械語プログラム中のサブルーチンに対応する該ソースプログラム中の関数名と、該サブルーチンのアドレスと、が対応付けられた関数情報テーブルをさらに有し、
該置換プログラムは該画像形成装置のプロセッサ又は該他のプロセッサに対し、
該関数情報テーブルに含まれる各サブルーチンのアドレスについて、該アドレスをインクリメントさせながら該機械語プログラム中のリターン命令を、該サブルーチンからのリターン命令として検出させる、
ことを特徴とする請求項１に記載の画像形成装置用トレース機能付加プログラム。
【請求項４】
該サブルーチンコール命令に関する情報は、該サブルーチンコール命令のオペランドである分岐先アドレスに関する情報を含むことを特徴とする請求項１又は２に記載の画像形成装置用トレース機能付加プログラム。
【請求項５】
該機械語プログラムは、高級言語のソースプログラムをコンパイルして生成されたものであり、
該機械語プログラム中のサブルーチンに対応する該ソースプログラム中の関数名と、該サブルーチンのアドレスと、が対応付けられた関数情報テーブルをさらに有し、
該ロギングプログラムは該画像形成装置の該プロセッサに対しさらに、該関数情報テーブルを参照させて、該分岐先アドレスに対応した関数名を、該分岐先アドレスに関する情報として取得させる、
ことを特徴とする請求項４に記載の画像形成装置用トレース機能付加プログラム。
【請求項６】
該サブルーチンコール命令に関する情報はさらに、そのサブルーチンへ引き渡される引数を含むことを特徴とする請求項４に記載の画像形成装置用トレース機能付加プログラム。
【請求項７】
該関数情報テーブルはさらに、該サブルーチンへ引き渡される全引数のデータサイズに関する情報を含み、該関数情報テーブルにおいて該全引数のデータサイズに関する情報がその関数名と対応付けられており、
該ロギングプログラムは該画像形成装置の該プロセッサに対し、
該関数情報テーブルに含まれる各関数名につき、該全引数のデータサイズに関する情報に対応した回数だけポップ命令を繰り返し実行させて全引数のデータを取得させる、
ことを特徴とする請求項６に記載の画像形成装置用トレース機能付加プログラム。
【請求項８】
該機械語プログラム中のサブルーチンに対応する該ソースプログラム中の関数名と、該サブルーチンのアドレスと、が対応付けられた関数情報テーブルをさらに有し、
該ロギングプログラムは該画像形成装置の該プロセッサに対し、
該関数情報テーブルに含まれる各サブルーチンのアドレスにつき、該アドレスをデクリメントさせながら該機械語プログラム中の規則的なプッシュ命令使用回数ｎを検出させ、ポップ命令をｎ回繰り返し実行させて全引数のデータを取得させる、
ことを特徴とする請求項６に記載の画像形成装置用トレース機能付加プログラム。
【請求項９】
該画像形成装置の該記憶手段に格納される逆置換プログラムをさらに有し、
該逆置換プログラムは該画像形成装置の該プロセッサに対し、該ロギングプログラムへのジャンプ命令をサブルーチンからのリターン命令に置換させる、
ことを特徴とする請求項１乃至８のいずれか１つに記載の画像形成装置用トレース機能付加プログラム。
【請求項１０】
プロセッサと、
該プロセッサに結合され、請求項９に記載の置換プログラムと逆置換プログラムとロギングプログラムとが格納される記憶手段と、
を有し、該置換プログラムと該ロギングプログラムと該逆置換プログラムとをこの順に実行させることによりエラー発生時のみトレース機能を付加できるようにしたことを特徴とする画像形成装置。
【請求項１１】
画像形成装置の記憶手段に格納された機械語プログラムにトレース機能を付加する画像形成装置用トレース機能付加方法であって、該記憶手段に格納される置換プログラムとロギングプログラムとを用い、
該置換プログラムにより該画像形成装置のプロセッサ又は他のプロセッサに対し、該機械語プログラムに含まれる、サブルーチンからのリターン命令を、語長が該リターン命令以下の、該ロギングプログラムへのジャンプ命令で置換させ、
該ロギングプログラムにより該画像形成装置の該プロセッサに対し、
置換されたジャンプ命令を含むサブルーチンからの戻りアドレスを取得させ、
ライトポインタが示すアドレスに基づいて、該戻りアドレスの直前に格納されているサブルーチンコール命令に関する情報を該記憶手段に格納させ、該ライトポインタの内容を、次に格納すべきアドレスに更新させ、
該プロセッサの命令ポインタを該戻りアドレスに変更させる、
ことを特徴とする画像形成装置用トレース機能付加方法。
【請求項１２】
該リターン命令のアドレスが複数記述されたアドレスデータをさらに用い、
該置換プログラムにより該画像形成装置のプロセッサ又は該他のプロセッサに対し、該アドレスデータに含まれるアドレスのリターン命令を該ジャンプ命令で置換させる、
ことを特徴とする請求項１１に記載の画像形成装置用トレース機能付加方法。
【請求項１３】
該機械語プログラム中のサブルーチンに対応する該ソースプログラム中の関数名と、該サブルーチンのアドレスと、が対応付けられた関数情報テーブルをさらに用い、
該置換プログラムにより該画像形成装置のプロセッサ又は該他のプロセッサに対し、
該関数情報テーブルに含まれる各サブルーチンのアドレスについて、該アドレスをインクリメントさせながら該機械語プログラム中のリターン命令を、該サブルーチンからのリターン命令として検出させる、
ことを特徴とする請求項１１に記載の画像形成装置用トレース機能付加方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コピー、プリント又はファクシミリ等の機能を備えた画像形成装置に係り、特に、必要時のみトレース機能を付加することが可能な画像形成装置用トレース機能付加方法及びプログラム並びにこのプログラムがインストールされた画像形成装置に関する。
【背景技術】
【０００２】
画像形成装置のプログラム開発段階では、デバッグオプションを有効にしてそのソースコードをコンパイルすることにより、デバッグ用コードを挿入し、その実行プログラムをデバッガと組み合わせて動作させることにより、エラー原因を究明してこれに対処することができる。
【０００３】
また、プログラム完成後のテスト段階では、さまざまなケースを想定してテストが行われる。
【０００４】
製品化段階では、デバッグオプションが無効にされてソースコードがコンパイルされ、これにより、プログラムサイズが小さくなるとともに、処理速度の遅延が防止される。
【０００５】
しかしながら、タイミングまで含めた全ての条件下でテストを行うのは不可能に近い。製品出荷後にエラーが発生した場合、画像形成装置にデバッグ機能が備えられていないので、エラー解析に長時間を要することになる。
【０００６】
下記特許文献１には、デコード回路により、ＣＰＵによってアクセスされたアドレスに基づいて、アクセス先がどこであるかを判定し、アクセス分析回路により、ＣＰＵがアクセスした内容を分析し、ログ受送信ＤＭＡにより、アクセス分析結果を出力する、トレース機能を備えた画像形成装置が開示されている。
【０００７】
しかし、画像形成装置にこのような回路が備えられていない場合には、エラーに至る動作をトレースすることができない。
【特許文献１】特開２００６−１１９６９号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
本発明の目的は、このような問題点に鑑み、トレース機能を備えていない画像形成装置に対しトレース機能を容易に付加することによりエラー解析時間を短縮化可能な画像形成装置用トレース機能付加方法及びプログラム並びにこのプログラムがインストールされた画像形成装置を提供することにある。
【０００９】
本発明の他の目的は、通常の動作を遅延させたりプログラムサイズを増大させたりすることなく、かつ、エラーが発生したときにユーザの操作でデバッグ機能を追加することにより、エラー解析時間を短縮化可能な画像形成装置を提供することにある。
【課題を解決するための手段】
【００１０】
本発明の第１態様は、画像形成装置の記憶手段に格納された機械語プログラムにトレース機能を付加する画像形成装置用トレース機能付加プログラムであって、該記憶手段に格納される置換プログラムとロギングプログラムとを有し、
該置換プログラムは該画像形成装置のプロセッサ又は他のプロセッサに対し、該機械語プログラムに含まれる、サブルーチンからのリターン命令を、語長が該リターン命令以下の、該ロギングプログラムへのジャンプ命令で置換させることを特徴とし、
該ロギングプログラムは該画像形成装置の該プロセッサに対し、
置換されたジャンプ命令を含むサブルーチンからの戻りアドレスを取得させ、
ライトポインタが示すアドレスに基づいて、該戻りアドレスの直前に格納されているサブルーチンコール命令に関する情報を該記憶手段に格納させ、該ライトポインタの内容を、次に格納すべきアドレスに更新させ、
該プロセッサの命令ポインタを該戻りアドレスに変更させる、
ステップを有する。
【００１１】
本発明による画像形成装置用トレース機能付加プログラムの第２態様では、第１態様において、
該リターン命令のアドレスが複数記述されたアドレスデータをさらに有し、
該置換プログラムは該画像形成装置のプロセッサ又は該他のプロセッサに対し、該アドレスデータに含まれるアドレスのリターン命令を該ジャンプ命令で置換させる。
【００１２】
本発明による画像形成装置用トレース機能付加プログラムの第３態様では、第１態様において、
該機械語プログラム中のサブルーチンに対応する該ソースプログラム中の関数名と、該サブルーチンのアドレスと、が対応付けられた関数情報テーブルをさらに有し、
該置換プログラムは該画像形成装置のプロセッサ又は該他のプロセッサに対し、
該関数情報テーブルに含まれる各サブルーチンのアドレスについて、該アドレスをインクリメントさせながら該機械語プログラム中のリターン命令を、該サブルーチンからのリターン命令として検出させる。
【００１３】
本発明による画像形成装置用トレース機能付加プログラムの第４態様では、第１又は２態様において、該サブルーチンコール命令に関する情報は、該サブルーチンコール命令のオペランドである分岐先アドレスに関する情報を含む。
【００１４】
本発明による画像形成装置用トレース機能付加プログラムの第５態様では、第４態様において、
該機械語プログラムは、高級言語のソースプログラムをコンパイルして生成されたものであり、
該機械語プログラム中のサブルーチンに対応する該ソースプログラム中の関数名と、該サブルーチンのアドレスと、が対応付けられた関数情報テーブルをさらに有し、
該ロギングプログラムは該画像形成装置の該プロセッサに対しさらに、該関数情報テーブルを参照させて、該分岐先アドレスに対応した関数名を、該分岐先アドレスに関する情報として取得させる。
【００１５】
本発明による画像形成装置用トレース機能付加プログラムの第６態様では、第４態様において、該サブルーチンコール命令に関する情報はさらに、そのサブルーチンへ引き渡される引数を含む。
【００１６】
本発明による画像形成装置用トレース機能付加プログラムの第７態様では、第６態様において、
該関数情報テーブルはさらに、該サブルーチンへ引き渡される全引数のデータサイズに関する情報を含み、該関数情報テーブルにおいて該全引数のデータサイズに関する情報がその関数名と対応付けられており、
該ロギングプログラムは該画像形成装置の該プロセッサに対し、
該関数情報テーブルに含まれる各関数名につき、該全引数のデータサイズに関する情報に対応した回数だけポップ命令を繰り返し実行させて全引数のデータを取得させる。
【００１７】
本発明による画像形成装置用トレース機能付加プログラムの第８態様では、第６態様において、
該機械語プログラム中のサブルーチンに対応する該ソースプログラム中の関数名と、該サブルーチンのアドレスと、が対応付けられた関数情報テーブルをさらに有し、
該ロギングプログラムは該画像形成装置の該プロセッサに対し、
該関数情報テーブルに含まれる各サブルーチンのアドレスにつき、該アドレスをデクリメントさせながら該機械語プログラム中の規則的なプッシュ命令使用回数ｎを検出させ、ポップ命令をｎ回繰り返し実行させて全引数のデータを取得させる。
【００１８】
本発明による画像形成装置用トレース機能付加プログラムの第９態様では、第１乃至８態様のいずれか１つにおいて、
該画像形成装置の該記憶手段に格納される逆置換プログラムをさらに有し、
該逆置換プログラムは該画像形成装置の該プロセッサに対し、該ロギングプログラムへのジャンプ命令をサブルーチンからのリターン命令に置換させる。
【発明の効果】
【００１９】
上記第１態様の構成によれば、置換プログラムが画像形成装置のプロセッサ又は他のプロセッサに対し、機械語プログラムに含まれる、サブルーチンからのリターン命令をロギングプログラムへのジャンプ命令で置換させ、ロギングプログラムが該画像形成装置の該プロセッサに対し、置換されたジャンプ命令を含むサブルーチンからの戻りアドレスを取得させ、該戻りアドレスの直前に格納されているサブルーチンコール命令に関する情報を、ライトポインタに基づいて該記憶手段に格納させ、該ライトポインタの内容を、次に格納すべきアドレスに更新させ、該プロセッサの命令ポインタを該戻りアドレスに変更させるので、トレース機能を備えていない画像形成装置にトレース機能を容易に付加することができ、これによりエラー解析時間を短縮することが可能となるという効果を奏する。
【００２０】
また、エラーが発生しなければ該トレース機能を付加する必要がないので、通常の動作が遅延せず且つそのプログラムサイズが大きくなるのを抑止することができるという効果を奏する。
【００２１】
さらに、トレース用の特別な回路を画像形成装置に備える必要がないという効果を奏する。
【００２２】
上記第２態様の構成によれば、該リターン命令のアドレスが複数記述されたアドレスデータをさらに有し、該置換プログラムが該画像形成装置のプロセッサ又は該他のプロセッサに対し、該アドレスデータに含まれるアドレスのリターン命令を該ジャンプ命令で置換させるので、トレースが必要な関数のみをトレースすることが可能になるという効果を奏する。
【００２３】
上記第３態様の構成によれば、該機械語プログラム中のサブルーチンに対応する該ソースプログラム中の関数名と、該サブルーチンのアドレスとが対応付けられた関数情報テーブルをさらに有し、該置換プログラムが該画像形成装置のプロセッサ又は該他のプロセッサに対し、該関数情報テーブルに含まれる各サブルーチンのアドレスについて、該アドレスをインクリメントさせながら該機械語プログラム中のリターン命令を、該サブルーチンからのリターン命令として検出させるので、トレース対象のサブルーチンのアドレスが分かれば、該画像形成装置の型式によらず同一プログラムで該画像形成装置にトレース機能を付加することができるという効果を奏する。
【００２４】
上記第５態様の構成によれば、該機械語プログラムは、高級言語のソースプログラムをコンパイルして生成されたものであり、該機械語プログラム中のサブルーチンに対応する該ソースプログラム中の関数名と、該サブルーチンのアドレスとが対応付けられた関数情報テーブルをさらに有し、該ロギングプログラムが該画像形成装置の該プロセッサに対しさらに、該関数情報テーブルを参照させて、該分岐先アドレスに対応した関数名を、サブルーチンへの分岐先アドレスに関する情報として取得させるので、エラー解析が容易になるという効果を奏する。
【００２５】
上記第６態様の構成によれば、該サブルーチンコール命令に関する情報はさらに、そのサブルーチンへ引き渡される引数を含むので、エラー解析がさらに容易になるという効果を奏する。
【００２６】
上記第７態様の構成によれば、該関数情報テーブルはさらに、該サブルーチンへ引き渡される全引数のデータサイズに関する情報を含み、該関数情報テーブルにおいて該全引数のデータサイズに関する情報がその関数名と対応付けられており、該ロギングプログラムが該画像形成装置の該プロセッサに対し、該関数情報テーブルに含まれる各関数名につき、該全引数のデータサイズに関する情報に対応した回数だけポップ命令を繰り返し実行させて全引数のデータを取得させるので、トレースにおいて引数を容易に取得できるという効果を奏する。
【００２７】
上記第８態様の構成によれば、該機械語プログラム中のサブルーチンに対応する該ソースプログラム中の関数名と、該サブルーチンのアドレスとが対応付けられた関数情報テーブルをさらに有し、該ロギングプログラムが該画像形成装置の該プロセッサに対し、該関数情報テーブルに含まれる各サブルーチンのアドレスにつき、該アドレスをデクリメントさせながら該機械語プログラム中の規則的なプッシュ命令使用回数ｎを検出させ、ポップ命令をｎ回繰り返し実行させて全引数のデータを取得させるので、トレース対象のサブルーチンのアドレスが分かれば、該画像形成装置の型式によらず同一プログラムで全引数のデータを取得できるという効果を奏する。
【００２８】
上記第９態様の構成によれば、逆置換プログラムが該画像形成装置の該プロセッサに対しさらに、該ロギングプログラムへのジャンプ命令をサブルーチンからのリターン命令に置換させるので、トレース後に該逆置換プログラムを実行させることにより、トレース後においても、通常の動作が遅延せず且つそのプログラムサイズが大きくなるのを抑止することができるという効果を奏する。
【００２９】
本発明の他の目的、構成及び効果は以下の説明から明らかになる。
【実施例１】
【００３０】
図８は、本発明の実施例１に係る画像形成装置１０のハードウェア構成を示す概略ブロック図である。
【００３１】
この画像形成装置１０では、ＭＰＵ１１がインタフェース１２を介して、ＲＯＭ１３Ｒ、ＮＶＲＡＭ１３Ｎ、ＤＲＡＭ１３Ｄ、ハードディスク１４、スキャナ１５、プリンタ１６、モデム１７、ＮＩＣ１８及び操作パネル１９に結合されている。図９では、簡単化のため、複数のインタフェースを１つのブロックで示している。
【００３２】
ＲＯＭ１３Ｒには、ブートストラップ及びＢＩＯＳが格納されている。ＮＶＲＡＭ１３Ｎは、例えばフラッシュメモリであり、これには、オペレーティングシステム（ＯＳ）、ＯＳの上層で動作するアプリケーション及びＯＳの下層で動作する各種デバイスドライバ並びに各種設定値が格納されている。該アプリケーションは、画像形成装置１０を複合機として機能させるためのものを含んでおり、この機能には、コピー、スキャン、プリント及びファクシミリがある。ＤＲＡＭ１３Ｄは主メモリ用である。ＤＲＡＭ１３Ｄは、原因不明のエラーが生じた場合に、後述のトレーサプログラム格納用としても用いられる。ハードディスク１４は、主にデータ格納用であり、後述のログファイルが格納される。
【００３３】
スキャナ１５は、コピー及びファックス送信での画像入力用である。プリンタ１６は、プリントエンジン、定着器並びに用紙の給紙部、搬送部及び排紙部を備えており、印刷データとして供給されるビットマップデータに基づいてプリントエンジンの感光ドラムに静電潜像を形成し、これをトナーで現像し、用紙に転写し定着させた後に排紙する。モデム１７は、ファックス送受信用である。ＮＩＣ１８は、ネットワーク上のホストコンピュータ２０に結合されて、プリントジョブ、ハードディスク１４に対するファイルアクセス及び上記トレーサプログラムのインストールの際に用いられる。操作パネル１９は、設定値又は指示を入力し、設定画面や状態などを表示させるためのものである。
【００３４】
ユーザ使用段階で原因不明のエラーが生じた場合、全アプリケーションプログラムを、デバッグオプションを有効にしてコンパイルしたプログラムに置き換え、さらにデバッガを追加すると、時間がかかるとともに、プログラムサイズが大きくなり過ぎてメモリを追加しなければならなくなり、実用的でない。
【００３５】
一方、エラーが生じた場合のプログラムの流れを機能単位で把握することができれば、エラー原因究明が容易になる。
【００３６】
そこで、本実施例１では、以下のようにして、既存の機械プログラムにトレース機能を付加する。
【００３７】
図３（Ａ）は、Ｃ言語で記述されたメインルーチンと、サブルーチン（関数）との関係を示す。
【００３８】
この例では、メインルーチンで関数ｆｎｃ１（ｘ０、ｙ０）が呼び出され、この関数のｒｅｔｕｒｎ命令が実行されると、メインルーチン内の関数呼び出し命令の次のステップへ戻る。
【００３９】
図３（Ｂ）は、図３（Ａ）のソースコードをコンパイルして機械語を生成し、これをニーモニックで記載したものである。コンパイラは、予め定められた規則に従ってコンパイルを行うので、関数呼び出しと関数からメインルーチンへの復帰について、Ｃ言語とアセンブリ言語のプログラム間で一定の対応関係がある。
【００４０】
すなわち、関数呼び出しの機械語においては、引数であるｘ０及びｙ０がそれぞれメモリからレジスタｅａｘへロードされた後、ｐｕｓｈ命令によりこのレジスタの内容がスタックエリアにプッシュされる。次いでサブルーチンコール命令ｃａｌｌ  ｆｎｃ１が実行されて、この命令の次の命令のアドレスが戻りアドレスとして、Ｐｅｎｔｉｕｍ（登録商標）の場合にはスタックエリアにプッシュされた後、ＰｏｗｅｒＰＣ（登録商標）の場合にはリンクレジスタｌｒに格納された後（以下同様）、アドレスｆｎｃ１へジャンプする。
【００４１】
この関数ｆｎｃ１では、スタックエリアから引数ｘ０及びｙ０がそれぞれスタックエリアからポップされて、これらが用いられる。関数ｆｎｃ１の最後のリターン命令ｒｅｔ（ＰｏｗｅｒＰＣの場合のリターン命令はブランチリンクレジスタ命令ｂｌｒ、以下単にリターン命令ｒｅｔと称す。）により、スタックエリアから戻りアドレスがポップされ又はリンクレジスタｌｒに格納された戻りアドレスに基づいて、メインルーチンへ戻る。
【００４２】
本実施例１では、図４に示す如く、既存の機械語プログラムに関数ロギングルーチンｆｎｃＬｏｇｇｉｎｇを追加するとともに、各関数の最後のリターン命令ｒｅｔをこの関数ロギングルーチンへの無条件ジャンプ命令ｊｍｐに置換する。これにより、関数ロギングルーチンの最後のリターン命令ｒｅｔが、置換前のリターン命令と同じ役割を果たすことになる。
【００４３】
本実施例１を実現させるためには、無条件ジャンプ命令ｊｍｐのバイト数が、リターン命令のそれ以下であることが要求される。この条件は、多くのプロセッサで満たされる。
【００４４】
関数ロギングルーチンでは、ｐｏｐ命令を実行して得られるレジスタの内容又はリンクレジスタの内容により、関数ｆｎｃ１からの本来の戻りアドレスを得る。このアドレスから、サブルーチンコール命令のバイト数を減算することにより、サブルーチンコール命令のアドレスを得る。なお、このｐｏｐ命令を実行した場合には、スタックポインタレジスタの内容をｐｏｐ命令実行前の値に戻しておく。
【００４５】
さらにこのアドレスを遡ってｐｕｓｈ命令の規則的使用回数ｎを検出し、又は、予めこのｎの値を求めておいて後述のようにテーブル化しておき、これを参照してｎの値を取得する。次いで、ｎ回ｐｏｐ命令を実行して、スタックエリアからこの関数の全引数を取り出す。
【００４６】
このようにして、関数ロギングルーチンは、これにジャンプする前の関数の呼び出し元での関数呼び出し情報を得ることができる。関数ロギングルーチンは、この関数呼び出し情報を取得してこれをメモリのログバッファ領域に格納し、さらに格納先アドレスを更新する。
【００４７】
このような処理により、呼出順の関数列のログをとることができる。この関数は、ネストされた関数であってもよい。
【００４８】
Ｃ言語のソースプログラムをコンパイルし、得られたオブジェクトプログラム間をリンクすると、Ｃ言語で定義した関数名とその関数のアドレスとを対応させた情報を含むシンボルテーブルが得られる。
【００４９】
図６は、このシンボルテーブルから抽出された関数名及びその入口アドレスと、その関数の全引数のワード数ｎと、この関数でのリターン命令のアドレス（出口アドレス）とを含む関数情報テーブルを示す。関数ロギングルーチンでは、このテーブルを参照して引数の値を取得し、関数名とその引数を含む関数呼出情報を、図７（Ａ）に示すように記述して、ログをとる。各引数のバイト数は同じとは限らないが、本実施例では説明の簡単化のため、同一とする。取得した引数列の区切りは、解析時に実際の区切りに直せばよい。
【００５０】
なお、上記シンボルテーブルを参照し又はソースコードから、各引数のタイプ及びバイト数を取得して関数情報テーブルに格納しておき、関数呼出情報を該ソースコードでの記述形式と同じにしてもよい。
【００５１】
また、リターン命令のアドレスは、図６中のサブルーチンのアドレスをインクリメントしながらリターン命令ｒｅｔを検出してそのアドレスを該サブルーチンのリターン命令のアドレスと決定する構成であってもよい。この場合、トレース対象のサブルーチンのアドレスが分かれば、画像形成装置１０の型式によらず同一プログラムで画像形成装置１０にトレース機能を付加することができる。
【００５２】
図１は、画像形成装置のデバック機能に関する機能ブロック図である。
【００５３】
図１中、ブロック３０〜３４及び１４は、画像形成装置１０に既存の構成であり、これに、トレーサ４０が付加される。
【００５４】
アプリケーションプログラム３０は、トレース対象の機械語プログラムであって、画像形成装置１０を複合機として機能させるプログラムの全部又はその一部である。周辺機器３１は、図８のスキャナ１５及びプリンタ１６のハードウェア構成であって、コントローラ３２により制御される。コントローラ３２は、スキャナ１５を制御するためのワンチップマイクロコンピュータと、プリンタ１６を制御するためのワンチップマイクロコンピュータとを備えている。アプリケーションプログラム３０の通信部３３は、これを構成するサブルーチンがＭＰＵ１１に対し、これらワンチップマイクロコンピュータと通信を行わせて、コントローラ３２へ制御用コマンド（要求）、例えばスキャン指令、給紙指令、ビットマップデータ送信開始指令及び後処理指令等を送信し、また、コントローラ３２から周辺機器３１の状態、例えば各給紙段の用紙の有無、スキャナの状態、紙詰まり等のエラー、トナー残量の程度、各カバーの開閉状態及びスイッチ操作状態等を取得する。これら要求及び状態は、ＯＳ及び通信バッファ３４を介して行われる。すなわち、通信部３３は、ＯＳに通信の要求をし、また、ＯＳを介し通信バッファ３４に受信した状態データを取得する。通信バッファ３４は、ＤＲＡＭ１３Ｄ内の共有領域の一部である。
【００５５】
コントローラ３２からのエラーやカバー開閉の変化などの状態通知は割込ルーチンで処理されるが、通信部３３での処理は他のルーチンからでも必要となるので、割込ルーチンから通信部３３のサブルーチンが呼び出される。
【００５６】
次に、トレーサ４０について説明する。
【００５７】
トレーサ４０は、ＭＰＵ１１用のソフトウェア構成（ログバッファを含む）であり、原因不明のエラーが発生した場合、その原因を究明するため、後述のようにユーザの操作により、一時的にＤＲＡＭ１３Ｄに格納される。
【００５８】
トレーサ４０は、ブロック４１〜５２を備え、これらのうちログバッファ４３、バッファポインタ４４、ログバッファ４７及びバッファポインタ４８は、ＤＲＡＭ１３Ｄ内の共有データ領域に構成される。
【００５９】
置換部４１は、正置換部と逆置換部とを備え、この正置換部は、図６の関数情報テーブルに含まれる、各リターン命令ｒｅｔのアドレスについて、このアドレスに格納されているリターン命令ｒｅｔを、上述のように、関数ロギングルーチンへの無条件ジャンプ命令ｊｍｐ  ｆｎｃＬｏｇｇｉｎｇで置換する。但し、通信部３３を構成する関数のリターン命令ｒｅｔのアドレスについては、このアドレスに格納されているリターン命令ｒｅｔを、後述の通信ロギングルーチンへの無条件ジャンプ命令ｊｍｐ  ｃｏｍＬｏｇｇｉｎｇで置換する。
【００６０】
図５は、図１の置換部４１による置換後のアセンブリ言語プログラムの概略説明図である。この図において、"ｉｎｔｅｒｒｕｐｔ"はコントローラ３２からの受信に応答して実行される割込ルーチンであり、この割込ルーチンで通信部３３のサブルーチン"ｃｏｍ"が呼び出される。サブルーチン"ｃｏｍ"は、"ｍａｉｎ"ルーチンからも呼び出される。
【００６１】
ロギング部４２は、上記関数ロギングルーチンで構成されている。置換部４１での正置換処理終了後にアプリケーションプログラム３０を起動させると、図６の関数情報テーブル内のシンボルで表されるロギング対象関数が呼び出される毎に、その関数からロギングルーチンへジャンプする。
【００６２】
ロギング部４２は、該関数の呼出元の関数呼出情報を上述のように取得して、これをログバッファ４３に格納させる。ログバッファ４３は、そのリードアドレスからライトアドレス−１まで有効データが格納されているループバッファ（範囲の上限アドレスから下限アドレスへ戻るエンドレスバッファ）であり、かつ、ＦＩＦＯバッファであって、リードポインタ４４０及びライトポインタ４４１を含むバッファポインタ４４を用いて管理される。すなわち、ロギング部４２は、ライトポインタ４４１で示されるアドレスから上記情報を書き込み開始するとともに、ライトポインタ４４１の内容を次の書込アドレスに更新する。
【００６３】
ログ収集部４５は、ログバッファ４３への書込完了毎に起動され、バッファポインタ４４の内容からログバッファ４３の使用率を求め、これが例えば９０％以上のときに、又は、画像形成装置１０がレディー状態のときに、バッファポインタ４４を参照して、ログバッファ４３の内容をログファイルとしてハードディスク１４に退避させ、リードポインタ４４０の内容を更新する。
【００６４】
一方、通信ロギング部４６は、上述の置換による通信部３３からのジャンプ毎に、ロギング部４２と同様にして、通信バッファ３４に新たに書き込まれた通信データをログバッファ４７に格納させる。この通信データは、通信バッファ３４に書き込まれたものであればよく、受信データのみでもよい。受信データは、送信データ（要求）に対応したものと、エラー状態のようにコントローラ３２から一方的に供給されるものを含むからである。バッファポインタ４８は、バッファポインタ４４と同様に、通信ロギング部４６及びログ収集部４５で用いられるとともに更新される。ログ収集部４５は、ログバッファ４７に対しても、ログバッファ４３に対する処理と同様のことを行う。
【００６５】
通信ロギング部４６はまた、ログバッファ４７へ通信データを格納させる際、このデータを識別する通信ＩＤ（シリアル番号）を通信データと対応させて格納させ、次いでメモリの共有エリア内の通知フラグＦをセットすることにより、新たな通信データが格納されたことをロギング部４２へ通知する。図７（Ｂ）は通信ログ説明図であり、"ｃｏｍ０１"等は通信ＩＤである。ロギング部４２は、通知フラグＦが‘１’であれば未格納の通信ＩＤをログバッファ４３に格納し、次いで関数呼出情報をログバッファ４３に格納する。
【００６６】
データ圧縮部４９は、ハードディスク１４に格納されたログデータを圧縮する。この圧縮には、同一引数を用いた同一関数の繰り返しをその繰り返し回数で表現することによる圧縮と、通常の圧縮とがある。前者は例えば、ｆｎｃ１（１０、１８）が５０回繰り返された場合、これをｆｎｃ１（１０、１８）×５０と表記することにより圧縮する。関数列を単位とする繰り返しについても同様である。
【００６７】
暗号化部５０は、この圧縮されたデータを暗号化する。これは、ログデータを解析することにより、プログラムの構造及び動作に関する秘密情報が漏洩するのを防止するためである。
【００６８】
ログ送信部５１は、圧縮され且つ暗号化されたログデータを、予め設定されたアドレスに、電子メールで送信する。
【００６９】
ユーザインタフェース部５２は、ホストコンピュータ２０からのコマンドに応じて、置換部４１の正置換部を起動させ又はデータ圧縮部４９を起動させる。
【００７０】
図２は、ロギング部４２の動作を示す詳細フローチャートである。以下、括弧内は図２中のステップ識別符号である。
【００７１】
（Ｓ０〜Ｓ２）通知フラグＦがセットされていれば、ログバッファ４７内の新しい通信ＩＤを改行コードとともにログバッファ４３に格納し、通知フラグＦをリセットする。
【００７２】
（Ｓ３）ｐｏｐ命令を実行してそのレジスタｅａｘから又はリンクレジスタｌｒから、戻りアドレスを取得する。
【００７３】
（Ｓ４）サブルーチンコール命令ｃａｌｌが例えば４バイトである場合、この戻りアドレスから４を減算して、サブルーチン呼出元のアドレスを求める。
【００７４】
（Ｓ５）該アドレスのサブルーチンコール命令ｃａｌｌのオペランドである分岐先アドレスを求め、関数情報テーブルを参照して、このアドレスに対応する関数名及び引数取得用ポップ命令繰返し数ｎを取得する。
【００７５】
（Ｓ６）関数名に"（"を付加したものをログバッファ４３に格納し、ライトポインタ４４１を更新する。
【００７６】
（Ｓ７）スタックポインタに−４ｎを加算する。但し、プッシュ命令及びポップ命令のそれぞれで１ワード＝４バイトのデータが移動するとする。
【００７７】
以下、Ｓ８とＳ１１の間の処理をｎ回繰り返す。
【００７８】
（Ｓ９）スタック領域からレジスタｅａｘへポップする。
【００７９】
（Ｓ１０）実引数（ｅａｘ）を区切り記号"，"とともにログバッファ４３に格納し、ライトポインタ４４１を更新する。ここに、（ｅａｘ）はレジスタｅａｘの内容を意味する。
【００８０】
（Ｓ１２）ログバッファ４３に最後に格納した区切り記号"，"を閉じ括弧"）"＋改行コードで置換し、ライトポインタ４４１を更新する。
【００８１】
このような処理により、Ｃ言語で記述された、引数を含む関数名を、関数が実行される毎に、順次ログバッファに格納させることができる。
【００８２】
次に、上記の如く構成されたトレーサ４０の使用方法を説明する。
【００８３】
トレーサ４０のプログラムと、これを画像形成装置１０のＤＲＡＭ１３ＤにＮＩＣ１８を介しインストールするプログラムとは、まとめて圧縮され、画像形成装置メーカーのＷｅｂサーバの外部記憶装置に格納されており、Ｗｅｂページからこれをダウンロード可能になっている。トレーサ４０のプログラムには、ログ送信部４２で用いられる上述の送信先アドレスが含まれている。このアドレスは例えば、メーカーのエラー解析担当者の電子メールアドレスである。
【００８４】
画像形成装置に原因不明のエラーが生じた場合、ユーザは、画像形成装置１０をリセットさせて初期状態に戻し、ホストコンピュータ２０を操作してこのプログラムを該Ｗｅｂページからダウンロードし、これを解凍させ、インストールプログラムを起動させて、ＮＩＣ１８を介しＤＲＡＭ１３Ｄにトレーサ４０のプログラムを格納させる。
【００８５】
ユーザは、ホストコンピュータ２０を操作して、ユーザインタフェース部５２を介し置換部４１の正置換部を起動させる。この置換が終了した後に、ユーザは、該エラーが生じた場合と同じ条件になるように操作パネル１９を操作する。これにより、ハードディスク１４に関数ログが周辺機器ログとともに格納される。
【００８６】
エラーが再現されると、ユーザは、ホストコンピュータ２０を操作して、ユーザインタフェース部５２を介しデータ圧縮部４９を起動させる。これにより、ログデータが圧縮され、さらに後暗号化され、そのデータが上記アドレスに電子メールで送信される。
【００８７】
次いで置換部４１の逆置換部が起動されて、アプリケーションプログラム３０が元の状態に戻る。ユーザは、画像形成装置１０をリセットさせて初期状態に戻す。これにより、トレーサ４０がＤＲＡＭ１３Ｄから消去された状態、すなわち画像形成装置１０が元の状態になる。
【００８８】
エラー解析担当者は、受信したデータを復号し、解凍して、エラー発生原因を究明する。この際、例えば、デバッガでこのログデータを用いて、該エラーに至る動作を再現させる。
【００８９】
本実施例１によれば、置換部４１の置換プログラムが画像形成装置１０のプロセッサ１１に対し、機械語プログラム３０に含まれる、サブルーチンからのリターン命令をロギング部４２のプログラムへのジャンプ命令で置換させ、ロギング部４２のプログラムがプロセッサ１１に対し、置換されたジャンプ命令を含むサブルーチンからの戻りアドレスを取得させ、該戻りアドレスの直前に格納されているサブルーチンコール命令に関する情報を、ライトポインタ４４１が示すＤＲＡＭ１３Ｄ内のアドレスに格納させ、ライトポインタ４４１の内容を、次に格納すべきアドレスに更新させ、リターン命令ｒｅｔ実行によりプロセッサ１１の命令ポインタを該戻りアドレスに変更させるので、トレース機能を備えていない画像形成装置１０にトレース機能を容易に付加することができ、これによりエラー解析時間を短縮することが可能となるという効果を奏する。
【００９０】
また、エラーが発生しなければ該トレース機能を付加する必要がないので、通常の動作が遅延せず且つそのプログラムサイズが大きくなるのを抑止することができるという効果を奏する。
【００９１】
さらに、トレース用の特別な回路を画像形成装置１０に備える必要がないという効果を奏する。
【００９２】
また、置換部４１のプログラムが画像形成装置１０のプロセッサ１１に対し、図７の関数情報テーブルに含まれるアドレスのリターン命令をジャンプ命令で置換させるので、トレースが必要な関数のみをトレースすることが可能になるという効果を奏する。
【００９３】
さらに、ロギング部４２のプログラムが画像形成装置１０のプロセッサ１１に対しさらに、該関数情報テーブルを参照させて、サブルーチンへの分岐先アドレスに対応した、高級言語の関数名のログをとるので、エラー解析が容易になるという効果を奏する。
【００９４】
さらにまた、簡単な構成でありながらサブルーチンの引数もログとして取得するので、エラー解析がさらに容易になるという効果を奏する。
【００９５】
また、関数情報テーブルに、全引数の規則的ｐｏｐ命令繰り返し回数ｎが含まれるので、トレースにおいて引数を容易に取得できるという効果を奏する。
【００９６】
また、トレース対象のサブルーチンのアドレスが分かれば、該アドレスをデクリメントさせながら該機械語プログラム中の規則的なプッシュ命令使用回数ｎを検出させることにより、画像形成装置の型式によらず同一プログラムで全引数のデータを取得できるという効果を奏する。
【００９７】
さらに、置換部４１の逆置換プログラムがプロセッサ１１に対しさらに、ロギング部４２のプログラムへのジャンプ命令をサブルーチンからのリターン命令に戻させるので、トレース後に該逆置換プログラムを実行させることにより、トレース後においても、通常の動作が遅延せず且つそのプログラムサイズが大きくなるのを抑止することができるという効果を奏する。
【００９８】
なお、本発明には外にも種々の変形例が含まれる。
【００９９】
例えば、図７の関数名の替わりにそのアドレス又はオペランドにこれを含むサブルーチンコールのコードのログをとり、エラー解析者側のプログラムでこれを関数名に変換してもよい。また、１つのプロセッサ１１でログをとっているので、ロギング部４２での処理中に通信部３３を呼び出す割込が生じないようにし（割込マスクをして）、ログバッファ４３とログバッファ４７とを１つにまとめた構成であってもよい。さらに、関数名列のログだけでもエラー解析に有効であるので、関数の引数までログをとらない構成であってもよい。
【０１００】
また、アプリケーションプログラム３０と同一のプログラムを、ホストコンピュータ２０にロードさせてホストコンピュータ２０側で上記置換を行わせ、又は、メーカー側で置換済のものを備えてユーザにこれをＷｅｂページからダウンロードさせ、次いでこれを画像形成装置１０に格納させる構成であってもよい。
【０１０１】
さらに、メモリ１３Ｒ、１３Ｎ若しくはＨＤＤ１４又はＵＳＢメモリなどのリムーバブル記憶装置にトレーサ４０のプログラムを予め格納しておき、上記同様にして必要時のみトレース機能を付加する構成であってもよい。
【図面の簡単な説明】
【０１０２】
【図１】画像形成装置のトレース機能に関する機能ブロック図である。
【図２】図１中のロギング部の動作を示す詳細フローチャートである。
【図３】（Ａ）はＣ言語で記述されたメインルーチンとサブルーチン（関数）との関係を示す説明図であり、（Ｂ）はさらに関数ロギングルーチンｆｎｃＬｏｇｇｉｎｇを追加したものの説明図である。
【図４】図３（Ｂ）に対応した機械語プログラムをニーモニックで記述したものの説明図である。
【図５】図１の置換部による置換後のアセンブリ言語プログラムの概略説明図である。
【図６】シンボルテーブルから抽出された関数名及びそのアドレスと、その関数の全引数のワード数ｎと、この関数でのリターン命令のアドレスとを含む関数情報テーブルを示す図である。
【図７】（Ａ）は、図１のトレーサで得られた関数ログの説明図であり、（Ｂ）は、このトレーサで得られた通信ログの説明図である。
【図８】画像形成装置のハードウェア構成を示す概略ブロック図である。
【符号の説明】
【０１０３】
１０  画像形成装置
１１  ＭＰＵ
１２  インタフェース
１３Ｒ  ＲＯＭ
１３Ｎ  ＮＶＲＡＭ
１３Ｄ  ＤＲＡＭ
１４  ハードディスク
１５  スキャナ
１６  プリンタ
１７  モデム
１８  ＮＩＣ
１９  操作パネル
２０  ホストコンピュータ
３０  アプリケーションプログラム
３１  周辺機器
３２  コントローラ
３３  通信部
３４  通信バッファ
４０  トレーサ
４１  置換部
４２  ロギング部
４３、４７  ログバッファ
４４、４８  バッファポインタ
４４０、４８０  リードポインタ
４４１、４８１  ライトポインタ
４５  ログ収集部
４６  通信ロギング部
４９  データ圧縮部
５０  暗号化部
５１  ログ送信部
５２  ユーザインタフェース部
【図１】
2008021066.tif 000003
【図２】
2008021066.tif 000004
【図３】
2008021066.tif 000005
【図４】
2008021066.tif 000006
【図５】
2008021066.tif 000007
【図６】
2008021066.tif 000008
【図７】
2008021066.tif 000009
【図８】
2008021066.tif 000010