C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[13]: .NetFramework3.5から4に変更すると例外発生 [1]


(過去ログ 102 を表示中)

[トピック内 26 記事 (21 - 26 表示)]  << 0 | 1 >>

■60921 / inTopicNo.21)  Re[8]: .NetFramework3.5から4に変更すると例外発生
  
□投稿者/ Ys (12回)-(2011/07/26(Tue) 10:50:06)
No60917 (む さん) に返信

む さん
返信ありがとうございます。

> DLLの方で関数に__stdcall付けてますか?
> 呼出規約は付けてなければcdecl、あればstdcallのはず。

すいません、最初に確認・報告すべきでした。
__stdcallは付いていません。

 extern "C" __declspec(dllexport) int OutPutData(char* CheckPathA, char* CheckPathB, char* XmlFile)

試しに__stdcallをつけてみたのですが、「エントリポイントが見つかりません」というエラーが出るようになってしまいます。


> ついでにこんな情報も有るようです。
>
> VisualStudio2010から、MDA(Managed Debugging Assistants)がデフォルトで有効になりました。
> MDAは、ランタイムイベントに関するメッセージを発生させ、マネージコードからアンマネージコードへの遷移時に発生する検出が難しいバグを分離できる機能です。
> PInvokeStackImbalanceは、このMDAによって検出されます。
> ・・・
> PInvokeStackImbalanceが検出されても、問題が露呈せず動作します。
> (PInvokeStackImbalanceを発生させ、食い違ったスタックの処理を.NETがうまくやります。)
> そのため、PInvokeStackImbalanceを無効にするという方法が取られることがありますが、もっと良い方法があります。
> それは、C#コンパイラに、MeCabのコンパイラの呼出規約を教えることです。
> ・・・
> http://wiki.sh4e.net/?Tips%2FOther%2FMeCab
>
> MDA pInvokeStackImbalance の無効化 ― CLR 2.0 でのデバッグ実行 (2)
> http://d.hatena.ne.jp/NyaRuRu/20051224/p1

PInvokeStackImbalanceを無視するということですよね?
確かに、PInvokeStackImbalanceが検出されてもそのままデバッグを続けることは可能のようです。
ただ、結局その後で落ちてしまいます。

引用返信 編集キー/
■60939 / inTopicNo.22)  Re[9]: .NetFramework3.5から4に変更すると例外発生
□投稿者/ Azulean (797回)-(2011/07/26(Tue) 22:37:00)
No60921 (Ys さん) に返信
>  extern "C" __declspec(dllexport) int OutPutData(char* CheckPathA, char* CheckPathB, char* XmlFile)
>
> 試しに__stdcallをつけてみたのですが、「エントリポイントが見つかりません」というエラーが出るようになってしまいます。

__stdcall をつけるということは呼び出し規約を変えることになります。
def ファイルなどで明示的に指定していないのであれば、エクスポートされる名前が _OutPutData@12 のような形になります。

VC の場合:
http://support.microsoft.com/kb/140485/en-us


> PInvokeStackImbalanceを無視するということですよね?

MDA のバグという高い裏付けがない場合、無視するという選択は危険です。
実際落ちるという症状を引き起こしているので、怪しいと感じます。



ところで、プロジェクトのプロパティのデバッグタブでアンマネージコードデバッグを有効にする、Visual Studio のオプション設定のデバッグの全般から毎コードのみ以外をデバッグ対象にした状態で、StackOverflowException を起こさせた場合、呼び出し履歴に何か怪しいものでていますか?
推測の材料にできそうな DLL 名とか、関数名とか。
引用返信 編集キー/
■60940 / inTopicNo.23)  Re[10]: .NetFramework3.5から4に変更すると例外発生
□投稿者/ む (3回)-(2011/07/27(Wed) 00:53:18)
関数をエクスポートする場合、Windows環境ではstdcallが一般的です。
あくまで「一般的」なので、必ずしも従う必要はありませんけど。

DLL側に手を加えても良いのであれば、extern "C" __stdcall + DEFファイル(■No60939 (Azulean さん)参照)でエクスポートしてみてはいかがでしょうか?
.NetではDllImportでStdcall/Winapiを指定して呼び出す。
改善しないようなら、何か根本的に見落としている事がありそう。(少なくとも呼出規約の疑いは晴れるかと)

実はDLL側で何か悪さしてた/されてた事が露見したとか・・・
.Netでは無い環境から呼び出したら結果は変わったりするんですかねぇ・・・
引用返信 編集キー/
■60968 / inTopicNo.24)  Re[11]: .NetFramework3.5から4に変更すると例外発生
□投稿者/ Ys (13回)-(2011/07/27(Wed) 17:21:11)
No60939 (Azulean さん) に返信

Azulean さん
返信ありがとうございます。

> ところで、プロジェクトのプロパティのデバッグタブでアンマネージコードデバッグを有効にする、Visual Studio のオプション設定のデバッグの全般から毎コードのみ以外をデバッグ対象にした状態で、StackOverflowException を起こさせた場合、呼び出し履歴に何か怪しいものでていますか?
> 推測の材料にできそうな DLL 名とか、関数名とか。


【ntdll.dll】が大量に発生しています!
何回か行うとたまに‘!'から後ろのほうの値が違うのがありますが、
 ntdll.dll!77c50a9d()
が大量に発生し、最終的に
 「[下のフレームは間違っているか、または見つかりません。ntdll.dllに対して読み込まれたシンボルはありません。]」
で例外が発生している模様です。

そのほかのパターンとして
 user32.dll!7656????()  ←?は様々な英数字の組み合わせ
が何回か発生し、
 「[下のフレームは間違っているか、または見つかりません。user32.dllに対して読み込まれたシンボルはありません。]」
で例外が発生している場合もあります。

すいません、私ではこれから推測することができないのですが、何かヒントになりますでしょうか?



No60940 (む さん) に返信

む さん
返信ありがとうございます。

> DLL側に手を加えても良いのであれば、extern "C" __stdcall + DEFファイル(■No60939 (Azulean さん)参照)でエクスポートしてみてはいかがでしょうか?
> .NetではDllImportでStdcall/Winapiを指定して呼び出す。
> 改善しないようなら、何か根本的に見落としている事がありそう。(少なくとも呼出規約の疑いは晴れるかと)

すいません、私が悪いのかどうしてもstdcallでうまく動きません。
また、本番ではDLL側に手を加えることが難しいかもしれません(といっても、本当にDLLが問題なら直さなければいけないのですが…)。


> 実はDLL側で何か悪さしてた/されてた事が露見したとか・・・
> .Netでは無い環境から呼び出したら結果は変わったりするんですかねぇ・・・

DLLを呼ぶだけの新規のソリューションを作ってテストしてみたら例外が発生しませんでした。(すいません、.NETで試してしまいました。。。)
・・・ということは、問題はDLLではなく、DLLを使ってるソリューション(プロジェクト)が問題!?

引用返信 編集キー/
■60975 / inTopicNo.25)  Re[12]: .NetFramework3.5から4に変更すると例外発生
□投稿者/ Azulean (800回)-(2011/07/27(Wed) 22:44:13)
2011/07/27(Wed) 22:44:39 編集(投稿者)

No60968 (Ys さん) に返信
> 【ntdll.dll】が大量に発生しています!
> 何回か行うとたまに‘!'から後ろのほうの値が違うのがありますが、
>  ntdll.dll!77c50a9d()
> が大量に発生し、最終的に
>  「[下のフレームは間違っているか、または見つかりません。ntdll.dllに対して読み込まれたシンボルはありません。]」
> で例外が発生している模様です。

ntdll.dll とか user32.dll の呼び出し履歴の行で右クリックして、シンボルを読み込むとかで、Microsoft のサーバーからシンボルの読み込みができませんか?
シンボルが読み込めると、ntdll.dll のどの関数を呼んでいるかなど、名前が見えるようになります。
名前が見えることで、どういった処理の流れになっているか推測できる材料になるかもしれません。


> DLLを呼ぶだけの新規のソリューションを作ってテストしてみたら例外が発生しませんでした。(すいません、.NETで試してしまいました。。。)
> ・・・ということは、問題はDLLではなく、DLLを使ってるソリューション(プロジェクト)が問題!?

さて。何か差があるのでしょうね。
少しずつ、問題のプロジェクトに近づけていってみて、原因を特定するというやり方もありそうですね。
引用返信 編集キー/
■60986 / inTopicNo.26)  Re[13]: .NetFramework3.5から4に変更すると例外発生
□投稿者/ Ys (14回)-(2011/07/28(Thu) 14:10:03)
No60975 (Azulean さん) に返信

Azulean さん
返信ありがとうございます。

> ntdll.dll とか user32.dll の呼び出し履歴の行で右クリックして、シンボルを読み込むとかで、Microsoft のサーバーからシンボルの読み込みができませんか?
> シンボルが読み込めると、ntdll.dll のどの関数を呼んでいるかなど、名前が見えるようになります。
> 名前が見えることで、どういった処理の流れになっているか推測できる材料になるかもしれません。

以下の関数が繰り返し呼ばれているみたいです。
・ntdll.dll!_RtlpCallVectoredHandlers@12() - 0xef1c バイト
・ntdll.dll!_RtlCallVectoredExceptionHandlers@8() + 0x12 バイト
・ntdll.dll!_RtlDispatchException@8() + 0x19 バイト
・ntdll.dll!_KiUserExceptionDispatcher@8() + 0xf バイト


> さて。何か差があるのでしょうね。
> 少しずつ、問題のプロジェクトに近づけていってみて、原因を特定するというやり方もありそうですね。

わかりました。
こちらも引き続き追ってみます。
引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -