2009-06-07 9 views
1

私は、ウィンドウ(64ビット)で作業しているプロジェクトの1つにいくつか問題があります。プログラムがクラッシュすることもありますが、時にはそうではありません。問題が複数のリンクされたCランタイムにリンクされていると思われます。ウィンドウでこれをどのように検出できますか? depends.exeを試してみましたが、CRTを報告しませんでした複数のリンクされたCランタイムをウィンドウで検出する

+0

クラッシュはどこですか?スタックトレースなどありますか? – Macke

+0

スタックトレースのないCランタイムのどこかに、残念ながら... –

答えて

3

複数のCランタイムライブラリを静的にリンクすることはできません。多くのシンボル定義の競合が発生し、大量の警告が発生します。無謀な技術者だけがそれらを無視するだろう。

dependsでは、動的プロファイルオプションを使用して、ロードする動的CRTLのすべての依存関係を確認します。もし何も起きなければ、私はあなたの問題が他のところにあると思う。

CレベルのAPIを持つDLLは、CRTLの共有状態(通常はメモリアロケータ)に頼ってはならないので、どのような場合でも問題は他のものと思われます。 caller-allocates、callee-use、memory allocation callbackなどのAPI間メモリ管理のための標準化されたプロトコルです。つまり、同じプロセス内の複数のCRTLは通常、メモリ管理プロトコル。

一時的な障害については、マルチスレッドまたはヒープの破損が考えられます。

+0

私は動的プロファイリングオプションを検討します。ありがとう CRLTの共有状態に関して、私はそれについて何もできないと思います。これはPython拡張のためのもので、メモリ割り当て部分(refcounting)では何も制御しません。私は複数のCRTが問題ではないというあなたの主張に驚いています - 私は窓の専門家から遠いですが、かなりの情報源から避けるべきであることを一貫して読んでいます。私はそれが慎重に避けることができると理解していますが、私はそれが最終的な実行可能ファイルのすべての部分を制御しないので、私のケースでは実行可能だとは思わない。 –

+0

ほとんどの場合、WindowsでDLLを使用すると、ソースはなく、使用しているランタイムライブラリを制御することはできません。 GNU CライブラリがあるLinuxのようなものではなく、すべての共有ライブラリは、mallocがプロセス全体で同じアロケータに解決することを(通常)信頼することができます。さらに、DLLは異なる言語で記述することができます。 C EXEで使用されているPascal DLL、またはその逆のDLLは、要件が異なるため、ランタイムライブラリを共有できません。したがって、メモリ管理規約またはプロトコルに従う必要があります。 –

+0

私は最終的にスタックトレースを取得することができました。問題は確かにDLL境界を越えて渡されるFILEです。だから私は何とかしなくてはならないと思う。 Windows上でのdll境界のプロトコルに関する参考資料はありますか?私はこの問題に本当に慣れていません。私が取り組んでいるコードベースのいくつかの場所でそれを処理する必要があるのでしょうか? –

関連する問題