教えてください。
関数実行結果をトレースすることは可能なのでしょうか?
色々調べてみるとスタックフレームやスタックトレースなどをうまく利用すれば実現可能なのかと思ったのですが、使用方法は例外発生時やデバッグ時(?)のことしか書かれていないようでした。
客先の環境で想定したルートを通っているか、モジュールが出力しているトレースからは判断できない場合(モジュール入替はできないとします)、スタックフレームなどを取得して、どういったルートを通っているか確認できないかと思っております。
モジュールを入替えず(デバッグオプションを付けてコンパイルなど)に実現するなどは無理なのでしょうか?
スタックフレームの参照方法
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: スタックフレームの参照方法
単体テストツールを使わずにってことでしょうか?
スタックトレースだとバックトレースしか出来ませんので網羅テストには難しいとおもいます。
それも一番奥の関数で通ってきたスタックフレーム(関数名)が分かるだけで解決するんでしょうか?
[補足]
そのための関数としてWindows環境ならStackWalk()があります。
http://msdn.microsoft.com/ja-jp/library/cc428994.aspx
主な目的はどちらかと言うとリリース後の異常終了時のバックトレース用です。
[追記]
単体テスト用にオープンソースでcppUnitってのもあるので参考にしてみてください(使ったことがないんですが)
「CppUnit 入門」
http://www.ogis-ri.co.jp/otc/hiroba/technical/CppUnit/
【さらに追記】
Cの単体テスト用モジュール。基本的にソースの書き変えは必要。
「C言語の単体テスト、いろいろ: ソフトウェアテストの勉強室」
http://softest.cocolog-nifty.com/blog/2 ... _394e.html
スタックトレースだとバックトレースしか出来ませんので網羅テストには難しいとおもいます。
それも一番奥の関数で通ってきたスタックフレーム(関数名)が分かるだけで解決するんでしょうか?
[補足]
そのための関数としてWindows環境ならStackWalk()があります。
http://msdn.microsoft.com/ja-jp/library/cc428994.aspx
主な目的はどちらかと言うとリリース後の異常終了時のバックトレース用です。
[追記]
単体テスト用にオープンソースでcppUnitってのもあるので参考にしてみてください(使ったことがないんですが)
「CppUnit 入門」
http://www.ogis-ri.co.jp/otc/hiroba/technical/CppUnit/
【さらに追記】
Cの単体テスト用モジュール。基本的にソースの書き変えは必要。
「C言語の単体テスト、いろいろ: ソフトウェアテストの勉強室」
http://softest.cocolog-nifty.com/blog/2 ... _394e.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
yan999
Re: スタックフレームの参照方法
早速の返信ありがとうございます。
>単体テストツールを使わずにってことでしょうか?
はい、そうです。
リリース媒体で外部ツールから実行状態(ここでは通った関数)をトレースできればと思いまして。
やはり関数内でトレースが取られていないと難しいのでしょうか?
>単体テストツールを使わずにってことでしょうか?
はい、そうです。
リリース媒体で外部ツールから実行状態(ここでは通った関数)をトレースできればと思いまして。
やはり関数内でトレースが取られていないと難しいのでしょうか?
Re: スタックフレームの参照方法
バックトレースの取得はGNUのライブラリにもありますが、業務プログラムだと使えないかもしれませんね。
http://www.gnu.org/software/libc/manual ... Backtraces
http://www.gnu.org/software/libc/manual ... Backtraces
Re: スタックフレームの参照方法
対象となるCPUタイプやコンパイラなどが分かっているのであれば、自作もそんなに難しくないかもしれませんね。
x86ならebpレジスタなんかを見てゴニョゴニョするだけですよね。
x86ならebpレジスタなんかを見てゴニョゴニョするだけですよね。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: スタックフレームの参照方法
デバッガーをマクロ制御すれば出来なくない気はしますが、やったら大変そうですね。
GDBのユーザ定義コマンドとコマンド・ファイルとか。
GDBのユーザ定義コマンドとコマンド・ファイルとか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
yan999
Re: スタックフレームの参照方法
皆様いろいろ返信ありがとうございます。
返信が遅くなってしまい申し訳ないです。
うーん、思った以上に難しいんですね。。
もっと簡単にできるものかと思っていました・・。
>x86ならebpレジスタなんかを見てゴニョゴニョするだけですよね。
なんだか調べてみたらまたまた勝手に出来そうな気分になってきました。。
もう少しebpレジスタあたりを調べてみようと思います。
皆様ありがとうございました。
返信が遅くなってしまい申し訳ないです。
うーん、思った以上に難しいんですね。。
もっと簡単にできるものかと思っていました・・。
>x86ならebpレジスタなんかを見てゴニョゴニョするだけですよね。
なんだか調べてみたらまたまた勝手に出来そうな気分になってきました。。
もう少しebpレジスタあたりを調べてみようと思います。
皆様ありがとうございました。