関数ポインタから関数名を取得する@VC++
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/01/31(土) 21:22:36値のとこに関数名出るじゃないですか。
あと、チューニング作業でprofilerってアプリあるじゃないですか。
関数ごとの実行回数計測するやつ。あれでも関数名出ますよね。
ああいうの、自分でもやりたいんですよね。書き出したりとかしたいんです。
なんとかなんないすか?
0002デフォルトの名無しさん
2009/01/31(土) 21:33:05あいちゃんです。
何か質問はありますか?
0003デフォルトの名無しさん
2009/01/31(土) 21:34:210004デフォルトの名無しさん
2009/01/31(土) 21:35:58関数名を取得する対象の関数には手を加えられませんよ。
0005デフォルトの名無しさん
2009/01/31(土) 21:43:27ここにもローカルルールってものがありますよね。
「あらゆる質問はまず「すれ立てるまでもない質問はここで」スレにしてください。」
って掲示板のトップに書いてありますよね。
なんとかなんないすか?
00061
2009/01/31(土) 21:46:561. 使ってるDLLからシンボルとかいうのを抜き出してリストにする
2. 関数ポインタをたよりにその関数名を示すシンボルを抜き出す
3. 関数名に変換(これは専用の関数があるっぽい)
という感じでしょうか?1.はなんとかなるかもですけど、2.がさっぱりわからんです
00071
2009/01/31(土) 21:48:35これはでかい問題だと思います。
一度2chで立って未解決で終わってるっぽいです。
ネットでググっても英語でも見付からんです。
総力を結集すべくスレにしましたよ。
0008デフォルトの名無しさん
2009/01/31(土) 22:09:300009デフォルトの名無しさん
2009/01/31(土) 23:36:54言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
00101 ◆0bNY21/WAs
2009/01/31(土) 23:49:17思っていたほど大きな問題ではなく
おれレベルだとすぐに解決しました。
念のためトリップをつけておきます。
0011デフォルトの名無しさん
2009/02/01(日) 00:53:33そのとおりだよ。
お前のレベルならスレ立てなくても解決できたことは想像に難くない。
だからスレ立てるなって言われただけだ。
00121
2009/02/01(日) 06:36:15いや、こいつニセモノ
0013デフォルトの名無しさん
2009/02/01(日) 10:38:06Binary Hacks
ttp://www.oreilly.co.jp/books/4873112885/
VC環境じゃないけどさ
00141
2009/02/01(日) 10:45:29しかし、VCじゃないのか。それじゃ仕事で使えない。
それになんかその本レベル高そうだな。
ちなみに、Linuxでは普通にできるらしい。
外国のサイトでチラっと見た。
00151
2009/02/01(日) 11:05:33用語解説はありがたい。
ttp://books.google.co.jp/books?id=Jzv3L2j6oqsC
00161 ◆0bNY21/WAs
2009/02/01(日) 11:11:45トリップなしで本物なんて言ってる偽者はなんなの?死ぬの?
00171
2009/02/01(日) 11:18:40http://d.hatena.ne.jp/Seasons/20080928/1222587606
>>6の1.はこれで良さそう
0018デフォルトの名無しさん
2009/02/01(日) 11:19:38ビルドの時に、デバッグ情報を出力するとか、マップファイルを出力するとか選べるハズで、これらで充分だと思うんだけど。
http://msdn.microsoft.com/ja-jp/library/cc429018.aspx
とか使ってみたの?
シンボルって用語を知ってれば、こんなスレ立てずに済んだのにね!
知らなくてもくだ質で充分だったはずだけどね!
じゃあ削除依頼しといてね!
00191
2009/02/01(日) 11:33:53ある動作をさせてトラブルがあった場合
そのトラブル時に呼び出した関数を全部一覧して出力します。
で、その問題の動作と類似する正常な動作をさせてこれについても関数名を出力し
比較するわけなんですよ。こうすればデバッグの時のヒントになるでしょう。
*.mapや*.pdbは見たことありますけど、そういや中身までは見てないです。
*.mapはプロファイルの時に使って覚えてます。
*.pdbはブレークポイントとか貼るのに必要だったかな。それくらいです。
00201
2009/02/01(日) 11:41:24実体がどういうものなのかよく分からなかったです。
先ほど上で紹介された本を見ると
bar::foo() => _ZN3Foo3BarE
というような変換が名前マングル(name mangling)というもので
この時右にあるような文字列がシンボルらしいです。
で、その逆
_ZN3Foo3BarE => bar::foo()
がデマングル(demangle)らしいです。
>>18
そのサイトは今なぜか見れないんであとで見ときます
00211
2009/02/01(日) 11:50:541. SymGetSymFromAddrを使い関数ポインタからシンボルを取得する
2. UnDecorateSymbolNameを使いシンボルを関数名に変換する
3. 関数名を書き出す
ということでいいんですね。
やっほ〜い
0022デフォルトの名無しさん
2009/02/01(日) 12:20:4400231
2009/02/01(日) 13:49:22が、まだ、俺としては課題もある。
あるmainの関数を経由して実行された全ての関数を書き留める、となると難しい。
その場合>>13にあるようなコードをはさんで再コンパイルしないといけない。
しかし、あれはVC++環境の話じゃないらしいし。
でも、プロファイラーができてるわけだし、何か方法があるんだろう。
0024デフォルトの名無しさん
2009/02/01(日) 14:17:370025デフォルトの名無しさん
2009/02/01(日) 14:27:050027デフォルトの名無しさん
2009/02/02(月) 04:49:300028デフォルトの名無しさん
2009/02/02(月) 08:15:35各関数の入り口でprintfすればいいと思います。
002918
2009/02/02(月) 10:51:17アセンブラを知ってれば、"機械語は調べれば分かる"ということを知ってるはずだ。
>>23
> でも、プロファイラーができてるわけだし、何か方法があるんだろう。
あるよ。
コンパイラに手を入れるか、exe を書き換えちゃう。
特定の時点までに経由したということなら >27 でおk。
解決したので削除依頼よろしくね。
0030デフォルトの名無しさん
2009/02/03(火) 16:31:170031デフォルトの名無しさん
2009/02/03(火) 16:53:43糞の分際で偉そうにするな
0032デフォルトの名無しさん
2009/02/04(水) 00:08:250033デフォルトの名無しさん
2009/02/05(木) 11:59:240034デフォルトの名無しさん
2009/02/05(木) 12:34:5900351
2009/02/07(土) 07:32:29>>21の方法だけど
関数の使い方が分からんかった。
依存関係がないのかな。
includeして使えんかったわ。
まぁ、主なコマンド関数は別の方法で書き出すことにしたけど。
0039デフォルトの名無しさん
2009/02/07(土) 16:14:18try {} catch ( ... ) { dump_stack_trace(); }
みたいに使うの?
まともに説明も出来なければ問題も分析できない無能な人ね。
単発スレを立てるわけだ。
00411
2009/02/07(土) 17:57:27そのコールバック関数はそれぞれ小さな処理なわけで
いろいろな場所からON_COMMAND経由で呼ばれてきます。
そいつの呼出履歴を全部分かるように出力できれば
正常な動作の呼出履歴と比較してどの処理が足りなかったのか
もしくは余分だったのか分かるじゃないですか。
0042デフォルトの名無しさん
2009/02/07(土) 18:01:13なんだ、只の阿呆か。
そもそもそんなことしなくても履歴を手繰る方法はあるしね。
00431
2009/02/07(土) 18:24:42落ちずに一見正常に動作するから厄介なんです
0044デフォルトの名無しさん
2009/02/07(土) 20:51:50自分で作ったの?
自分で作ったんなら、その我々には皆目見当も付かない ON_COMMAND が
関数ポインタ経由で呼び出すときにその関数のアドレスを map ファイルから
辞書引きしたらいいんじゃないの?
っていうか、これもくだ質でいいよね。
19 に書いてあるって、わかるわけねーよ。無能は気楽でいいよ。
ロギングなら、ログ取りたい人の責任でやることだしロギングライブラリ探すべきでしょ普通。
0045デフォルトの名無しさん
2009/02/07(土) 23:32:32単発の質問のスレで答えようとしなくていいよ。
00461
2009/02/08(日) 08:43:44MFCのことじゃないですか。ここはVC++のスレですよ。
mapファイルに書いてあるアドレスにいつも必ず決まった関数を配置するの?
関数の配置場所なんて毎回変わるもんだと思ってたけど。
0047デフォルトの名無しさん
2009/02/08(日) 09:56:230049デフォルトの名無しさん
2009/02/08(日) 16:14:48map ファイルはリンクの度に作成される。
ON_COMMAND マクロを書き換えて、適当なロギング処理呼び出しを加えなさい。
直接書き換えるのが嫌なら、ON_COMMAND を呼ぶ自作マクロを作ってそれに置き換えなさい。
そしたら削除依頼を出してきなさい。
一体どうしたら、こんなに無知無能且つ傲慢になれるのだろう。
0050デフォルトの名無しさん
2009/02/08(日) 17:43:03なんで莫迦な>>1の相手すんだお前は。
>そしたら削除依頼を出してきなさい。
莫迦な>>1なんだからそんな殊勝な事するワケないだろ。
0052デフォルトの名無しさん
2009/02/11(水) 07:49:260053デフォルトの名無しさん
2009/02/12(木) 04:28:300054デフォルトの名無しさん
2009/03/18(水) 20:12:070055デフォルトの名無しさん
2009/03/25(水) 23:28:48void fun(char *a[]){
int i;
for(i=1;i<=10;i++){
a[i]="test";}}
void main(void){
char cr[10][100];
int i;
fun(cr);
for(i=0;i<=10;i++){
printf("test->%s\n",cr[i]);
}}
上記の様なことをしたいのですが、どの様に訂正したら問題なく動くのでしょうか?
0056デフォルトの名無しさん
2009/03/26(木) 12:40:36「の様なこと」がさっぱりわからん。
2次元配列のポインタを受け取る関数の宣言なら
void fun(char (*a)[10][100])
0057デフォルトの名無しさん
2009/03/27(金) 08:14:35void fun(char (*a)[]){ ○
0058デフォルトの名無しさん
2009/03/27(金) 08:15:33C99ならこれでいけないだろうか、試してないしうろ覚えだけど
void fun(char (*a)[*]){
0059デフォルトの名無しさん
2009/03/27(金) 09:41:33void fun(char *a[]){
を
void fun(char a[][100]){
に、
a[i]="test";}}
を
memcpy( a[i], "test" );}}
に。
配列とポインタと文字列をまだキッチリと理解してない。
多くの人が難解に思うところだから頑張れ。
0060デフォルトの名無しさん
2009/03/28(土) 00:09:070061デフォルトの名無しさん
2009/03/28(土) 00:10:510062デフォルトの名無しさん
2009/03/28(土) 00:13:320064デフォルトの名無しさん
2009/03/29(日) 11:32:39■ このスレッドは過去ログ倉庫に格納されています