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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yan999

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

#1

投稿記事 by yan999 » 14年前

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 14年前

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

[補足]
そのための関数として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: スタックフレームの参照方法

#3

投稿記事 by yan999 » 14年前

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

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

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

#4

投稿記事 by beatle » 14年前

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

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

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

#5

投稿記事 by beatle » 14年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 14年前

デバッガーをマクロ制御すれば出来なくない気はしますが、やったら大変そうですね。
GDBのユーザ定義コマンドとコマンド・ファイルとか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yan999

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

#7

投稿記事 by yan999 » 14年前

皆様いろいろ返信ありがとうございます。
返信が遅くなってしまい申し訳ないです。

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

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る