2016-05-07 21 views
0

Imは、ctypes経由でpythonによって呼び出されるC++ライブラリをビルドしています。この関数は、構造体へのポインタをパラメータとして持ち、それを他の(内部の)関数に渡します。それは次のようになります。ポインタ関数の引数が破損している、スタックの破損?

extern "C" __declspec(dllexport) void USBEndpoint_subscribe(USBEndpoint* endpoint, CALLBACK callback) { 
    try { 
    subscribe_internal(endpoint, callback); 
    } catch (int e_code) { 
    exception_report(__FILE__, __LINE__, e_code); \ 
    } catch (...) { 
    exception_report(__FILE__, __LINE__); 
} 

void subscribe_internal(USBEndpoint* endpoint, CALLBACK callback) 
{ 
    ... 
} 

事は、エンドポイントの値がUSBEndpoint_subscribeで受け取ったということですsubscribe_internal入り、同じ値ではありません。例えば:subscribe_internal値は内部 終点= 0x00000000088f0680(およびコールバック= 0x0000000000540f50)

とすぐ私はsubscribe_internalにステップとして、:デバッグ中

私はUSBEndpoint_subscribeのrecievesを見ることができる 終点= 0x000007fef15f7740(コールバック= 0x0000000000000000)。

私は他のスレッドを生成していないので、リリースモード**でライブラリをコンパイルしています。私の唯一の容疑者はスタックの破損になる可能性がありますが、実際に何が起こっているのかを知っています。

何が起こっているかのヒントは大歓迎です。

**私はデバッグモードでPythonをコンパイルしましたが、スパイダーでセットアップするのが遅く、デバッグコンパイルされたバージョンを使用していると対話型コンソールが緩んでいますので、リリースPythonを固執し、 。

EDIT:

示唆したように、私は、ライブラリのデバッグコンパイルでのpythonの私のデバッグバージョンを使用していました。しかし、私はまだ同じ動作をしています(エンドポイント:0x0000000002be80e0-> 0x0000000000000000、コールバック:0x0000000000320f88-> 0x00000000024d24b8)。リリースモードではない他の有益な情報はここには表示されません。

+0

これはWindows上でx86-64であると想定するのは安全ですか? – Dolda2000

+3

これは不便かもしれませんが、おそらくデバッグビルドを分解して使用する必要があります。リリースは、典型的なすべてのデバッグシンボルを削除し、デバッガに予期しない結果を表示させる最適化を実行します。 – Aenimated1

+0

はい、これはWindowsではx64です。 – jabozzo

答えて

0

私はロードしていました。CDLL( "path")を使用してライブラリを呼び出していました。これは呼び出し規約cdeclを作成します。そして、たとえ私がVS2008で/ Gdを使ってコンパイルしていても、他の規約を使っているようです。 __cdeclを関数宣言に追加することで問題は解決されます。

+0

'__cdecl'はx86ターゲットのデフォルトにする必要があります。 x64の場合、 '__cdecl'と' __stdcall'は無視されます。 '__vectorcall'が指定されていない限り、コンパイラはWindows x64呼び出し規約を使用します。 – eryksun