今年は猛暑と台風が続いてます。お久しぶりの田原です。traceの使い方をご紹介しました。その前後で本業でも使っていたのですが、その後問題があることに気が付きましたので補足します。ファイルを使ってアドレスをソース名と行番号へ変換しますが、他のPCへ持っていくとあら残念、アドレスがアドレスのまま意味のない文字列になってしまうのです。埋め込まれているからです。ファイルはビルドした時のパスにそのまま置いていることが多いと思います。一緒に移動すると思いますが、ほとんどのケースでビルドした時の位置とは異なる位置へ置くでしょう。(msvcではDebugとかReleaseの下に生成されますが、ターゲットのPCでこれらの下へ置くケースはほとんどないように思います。ファイルの位置を見失い変換できなくなるという落ちでした。スタック・トレースを実装したのは久しぶりだったのですっかり失念してました。2.対策は?シンボル変換APIに.pdbファイルの場所を教える、シンボル変換APIが.pdbファイルを探す場所に置く等色々対策は考えられます。他にもネットワーク上に置くなどもできるような印象でした。大げさな方法に手を出したくはないので比較的簡単な方法で対策してみました。.pdbファイルを.exeと一緒に配布し同じフォルダに置くことを前提としています。.pdbファイルには.exeの解析に有用な情報が入っていますので、もし、解析をより困難にされたい方はまた別の対策をした方が良いです。現実問題、ある程度大きなプロジェクトならそのソースを読むだけでもたいへんです。仮に.pdbファイルが有ったとしてもコメントはまるっと削られていますから解析はソースを読むより遥かにたいへんです。それだけの費用を掛けてでも解析したくなるようなセキュリティや金融系のプログラムでなければ、実際に使われている場面で発生したトラブルをより短時間で対策できるように仕込んだ方が得るものが多いような気がします。stacktraceはそのためのI/Fを持っていませんので、boostのソースを修正します。そのかわりと言ってはなんですが、ユーザ側のプログラム修正は不要です。debugging_symbolsクラスのデフォルト・コンストラクタを次のように修正します。使用許諾されています。それ以外の部分はご自由に使って下さい。ご自身の責任でお願いします。APIを直接使っています。.exeのあるフォルダのフルパスを得ます。.pdbファイルがここにあると認識するようになります。.exeを配置した時にもトラブルが起きにくいと思いますが、実際にそのような使い方をするケースは稀と思いますので手抜きしています。クラスのインスタンスです。COMのインタフェースです。defined(_WIN32)で十分な筈)が、boost内部での条件判定をそのままコピペしました。「郷に入らば郷に従え」ですので。(必要もないのに郷に逆らうのはリスキーですから。)昔、VC++でCOMインタフェースを呼び出す時に簡単なことをやるのに結構多くのコードを書かないと行けないのでむちゃくちゃ苦労した記憶があるのですが、boostはcom_holderというクラス・テンプレートを内部的に作って簡単に呼び出しています。1.0の条件はかなり緩い(自由に使える上バイナリでの著作権表示義務無し)ので取り出して使うのも良いかも知れません。.pdbファイルのある場所を探すようにさせるこちらの対策はboostのソースの修正が不要です。boostのソースを管理対象から外したい時有用です。(boostのソースは膨大ですから。)リンカーの/PDBALTPATHパラメータを使って.pdbファイルのファイル名だけを指定するとカレント・ディレクトリを探すようになります。.exeのあるディレクトリと一致しないことも多々ありますからご注意下さい。一致することも多々ありますので混乱しやすいです。.exeのあるフォルダになるように注意深くプログラミングして下さい。Studioから起動した時)ので要注意です。そこで必要な時に、カレント・ディレクトリを.exeのあるフォルダへ移動してしまうと安心です。前々回のスタック・トレースのサンプルの最終形を修正してみました。sub(5);}カレント・ディレクトリの設定箇所が分かりやすいよう、boost::stacktrace::stacktraceインスタンスの生成と出力を分けました。このサンプルはスタック・トレース取得後直ぐに終了するのでカレント・ディレクトリは戻していません。スタック・トレース取得後もプログラムの実行を継続する場合にはスタック・トレース取得後に戻しておいた方がトラブルが起きにくいです。パスを使用)の最後に次のような記述があります。環境変数をその値に拡張します。生成された実行ファイルの拡張子です。便利そうな機能なので試してみたのですが、結局使い方が分かりませんでした。.exeの中をバイナリ・エディタで見ながら下記のようなトライをしました。.pdbファイルのフルパスが入っていた領域が%stack_trace.pdb%となりました。ファイルをみつけることができません。この時のstack_trace.pdbは正しい名前なので前後の%が余計です。環境変数が使えるらしいので、/PDBALTPATH:%ProgramFiles(x86)%を指定してみた間にスペースがあるため、File(x86)%部分がリンカにとって謎のパラメータとなりリンカ・エラーでした。そこで、/PDBALTPATH:'%ProgramFiles(x86)%'を指定してみたリンカはちゃんと認識し、エラーになりません。Files(x86)%へ展開されていました。残っているのでシンボル変換APIは認識しません。開発環境の環境変数を展開してどうする!!(怒)これって役に立つのでしょうか?(私は正しい使い方を理解できませんでした。.exeに埋め込まれているため、.pdbファイルを.exeと一緒に別のフォルダへ移動するとソース名や行番号がでなくなり、事実上役に立ちません。開発環境のPCでテストしている限り、これが顕在化しないのでなかなか頭の痛い不具合になりそうです。今回はその対策を2つ説明しました。他にもデータベースに.pdb情報を登録するとか、インターネット上のサーバに置いておく等の手段もありそうでしたが、大掛かりなことになりそうなのでスルーしました。興味のあるかたは調べてみると有用かも知れません。Studio)が主ですので、IDEに探させるための記事が多くいです。するとデータベースやインターネットの話もIDE登録のことかも知れません。他の言語のようにC++でもお手軽にスタック・トレースが取れるようになることを祈りつつ、今回はこの辺で終わります。コメントをキャンセルメールアドレスが公開されることはありません。テクノロジーの登録商標です。technology.ブログ内サンプル・コードのライセンス1.本ソフトウェアは、ご自由にお使いください。2.本ソフトウェアは、あるがままの姿で提供いたします。明示黙示を問わず、瑕疵がないこと、特定の目的に適合すること、使用地域における法令の規制等に合致すること、その他一切の保証をいたしません。3.本ソフトウェアについては、無償で提供するものですので、何らかの不具合が発生した場合であっても、セオライドテクノロジーは、何らの責任も負いません。使用するかどうかのご判断も、ご自身でお願いいたします。テクノロジーは一切その責任を負いません。データのバックアップ等については、お客様の責任において行ってください。テクノロジーは一切その責任を負いません。テクノロジーは、一切の責任を負いません。7.セオライドテクノロジーは、本ソフトウェアに関する技術的サポートは行いません。