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)。リリースモードではない他の有益な情報はここには表示されません。
これはWindows上でx86-64であると想定するのは安全ですか? – Dolda2000
これは不便かもしれませんが、おそらくデバッグビルドを分解して使用する必要があります。リリースは、典型的なすべてのデバッグシンボルを削除し、デバッガに予期しない結果を表示させる最適化を実行します。 – Aenimated1
はい、これはWindowsではx64です。 – jabozzo