ページ 11

スタックフレームの参照方法

Posted: 2012年4月29日(日) 23:11
by yan999
教えてください。
関数実行結果をトレースすることは可能なのでしょうか?
色々調べてみるとスタックフレームやスタックトレースなどをうまく利用すれば実現可能なのかと思ったのですが、使用方法は例外発生時やデバッグ時(?)のことしか書かれていないようでした。
客先の環境で想定したルートを通っているか、モジュールが出力しているトレースからは判断できない場合(モジュール入替はできないとします)、スタックフレームなどを取得して、どういったルートを通っているか確認できないかと思っております。

モジュールを入替えず(デバッグオプションを付けてコンパイルなど)に実現するなどは無理なのでしょうか?

Re: スタックフレームの参照方法

Posted: 2012年4月30日(月) 00:06
by softya(ソフト屋)
単体テストツールを使わずにってことでしょうか?
スタックトレースだとバックトレースしか出来ませんので網羅テストには難しいとおもいます。
それも一番奥の関数で通ってきたスタックフレーム(関数名)が分かるだけで解決するんでしょうか?

[補足]
そのための関数として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

Re: スタックフレームの参照方法

Posted: 2012年4月30日(月) 00:58
by yan999
早速の返信ありがとうございます。
>単体テストツールを使わずにってことでしょうか?
はい、そうです。
リリース媒体で外部ツールから実行状態(ここでは通った関数)をトレースできればと思いまして。
やはり関数内でトレースが取られていないと難しいのでしょうか?

Re: スタックフレームの参照方法

Posted: 2012年4月30日(月) 06:27
by beatle
バックトレースの取得はGNUのライブラリにもありますが、業務プログラムだと使えないかもしれませんね。
http://www.gnu.org/software/libc/manual ... Backtraces

Re: スタックフレームの参照方法

Posted: 2012年4月30日(月) 06:30
by beatle
対象となるCPUタイプやコンパイラなどが分かっているのであれば、自作もそんなに難しくないかもしれませんね。
x86ならebpレジスタなんかを見てゴニョゴニョするだけですよね。

Re: スタックフレームの参照方法

Posted: 2012年4月30日(月) 11:12
by softya(ソフト屋)
デバッガーをマクロ制御すれば出来なくない気はしますが、やったら大変そうですね。
GDBのユーザ定義コマンドとコマンド・ファイルとか。

Re: スタックフレームの参照方法

Posted: 2012年5月13日(日) 19:16
by yan999
皆様いろいろ返信ありがとうございます。
返信が遅くなってしまい申し訳ないです。

うーん、思った以上に難しいんですね。。
もっと簡単にできるものかと思っていました・・。

>x86ならebpレジスタなんかを見てゴニョゴニョするだけですよね。
なんだか調べてみたらまたまた勝手に出来そうな気分になってきました。。

もう少しebpレジスタあたりを調べてみようと思います。
皆様ありがとうございました。