カテゴリー別

お絵描き、デザイン

写真、動画関連ソフト

アメーバピグ専用ソフト

ホームページ関連

画像処理

スキャナー用

SEO 関連

お楽しみ

その他

過去ログ

2018年02月27日(火)

StackWalk64 が何故かおかしな値しか返さない不具合の修正方法

だいぶ前にコーディグした
スタックトレースを取得するコードが
うまく動いていなかったので修正しました。

スタックトレースは、 StackWalk64 が 非0 を返すまで呼べば
取得できるのですが、何故か 1 コか 2 コしか返さないうえ、
関数名を取得してみると、よくわからないものが入ってます。

コードにおかしなところが無さそうだったので、
サンプルコードでも探してみようと思って
検索をかけてみると、原因がわかりました。

StackWalk64 の使い方はココ にあります。
英語ですが、読めば使い方がわかると思います。

で、StackWalk64 がおかしな値を返す原因は、
カレントスレッドのコンテキストの取得に、
GetThreadContext を使っているところにありました。

GetThreadContext をよく読むと確かに、
「GetThreadContext をカレントスレッドに対してコールすると、
 成功しますが、得られるコンテキストは、無効です」
とありますね。

・・・

なんでやねん。そんな仕様あるかよ^^。

で、ココ にあるように、Win32 ではアセンブラのコード、
x64 では、RtlCaptureContext を使うことで、
正しいアドレスが取得できるようになりました。

・・・

ちなみに、スタックトレースというのは、
関数呼び出しの入れ子情報のことです。

例えば、main 関数から a() を呼びだし、
a() の中で b() を呼びだしたときの
スタックトレースは、main > a > b
みたいな感じになります。

スタックトレースはデバッガーで
停止すれば見られるのですが、
スタックトレースをコードで取得すると
ログに吐いたり、ある時点でのトレースを
後から見たりできて便利です。

ちなみに、今回スタックトレースを使いたくなったのは、
ログにスタックトレースを吐きたかったからです。

具体的には、 ローカルブラウザ の閲覧履歴に変更があったときの
デバッグ用のログに、スタックトレースも出力することで
デバッグしやすくしました。

ローカルブラウザ は自分のパソコンに保存した
html や xml を開きやすくしたウェブブラウザーです。

気になる方は、試してみてくださいね!

ローカルブラウザ
ローカルブラウザのダウンロード
ローカルブラウザの更新履歴
ご意見・ご要望連絡窓口


コメント
コメントする