私のアプリケーション(Javaベース)はWindows用のPythonを起動し、次にos.spawnv
を呼び出して別のPythonを起動します。Windowsライブラリucrtbaseからスローされたアクセス違反をデバッグする方法はありますか?
随時、アクセス違反の例外が発生しています。私はここにc:\build\cpython\modules\posixmodule.c @ 5299
にBPを設定しました
00 005eedb0 763e68f3 ucrtbase!<lambda_7d9ee38b11181ddfdf5bd66394e53cb7>::operator()+0x1b
01 005eedfc 763e65d9 ucrtbase!construct_environment_block<char>+0xdb
02 005eee14 763e7aba ucrtbase!common_pack_argv_and_envp<char>+0x31
03 005eeebc 763e778a ucrtbase!execute_command<char>+0x62
04 005eeee8 763e8066 ucrtbase!common_spawnv<char>+0x13f
05 005eeef8 65a323d7 ucrtbase!_spawnve+0x16
06 005eef38 65a360c6 python35!os_spawnve_impl(int mode = 0n0, struct _object * path = 0x03adfde0, struct _object * argv = 0x03b258a0, struct _object * env = 0x03b25a80)+0x1a7 [c:\build\cpython\modules\posixmodule.c @ 5299]
は私が二回すべての引数をチェックしました
Py_BEGIN_ALLOW_THREADS
spawnval = _spawnve(mode, path_char, argvlist, envlist);
Py_END_ALLOW_THREADS
Pythonのソースに見えるものです:彼らはOKです。 mode
が0の場合、path_char
は私のインターピタへのパス、argvlist
およびenvlist
はともにchar**
です。NULL終了文字列のNULL終端配列。
だから、それはpythonの不具合ではありません。
_spawnve
はスレッドセーフではありませんが、スレッドは1つしかありません。
MS ucrtbaseのソースもプライベートシンボルもありません。それを調査する正しいアプローチは何ですか?
-
ucrtbased.dll
とucrtbase.dll
の違いは何ですか? もっと多くのシンボルを見つけるために、Pythonをucrtbased.dllに対してコンパイルすべきですか?
デバッグビルドでは、ucrtbased.dllとpython35_d.dllが使用されます。デバッグビルドを使用すると、問題を見つけやすくなります。 '!analyze -v'を試してみてください。 – eryksun
Visual Studio 2015にインストールされているCRTのソースが必要です。たとえば、「C:¥Program Files(x86)¥Windows Kits¥10¥Source¥10.0.10586.0¥ucrt¥」に 'construct_environment_block'の定義があります。 exec \ cenvarg.cpp "となります。 – eryksun
Crtソースとプライベートはvcディレクトリツリーのsrcフォルダの下のsdk/wdkに入っています – blabb