2016-12-17 3 views
0

私のアプリケーション(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.dllucrtbase.dllの違いは何ですか? もっと多くのシンボルを見つけるために、Pythonをucrtbased.dllに対してコンパイルすべきですか?

+1

デバッグビルドでは、ucrtbased.dllとpython35_d.dllが使用されます。デバッグビルドを使用すると、問題を見つけやすくなります。 '!analyze -v'を試してみてください。 – eryksun

+1

Visual Studio 2015にインストールされているCRTのソースが必要です。たとえば、「C:¥Program Files(x86)¥Windows Kits¥10¥Source¥10.0.10586.0¥ucrt¥」に 'construct_environment_block'の定義があります。 exec \ cenvarg.cpp "となります。 – eryksun

+1

Crtソースとプライベートはvcディレクトリツリーのsrcフォルダの下のsdk/wdkに入っています – blabb

答えて

0

SciPyを構築しようとしているときに同じ問題が発生しました。 setup.pyの一部としてCコンパイラspawnve()にアクセスしようとすると、アクセス違反がスローされます。

私はまだその底には達していませんが、少なくとも私の場合は分解を進んでいます。

  • コールget_environment_from_os()これは、現在のプロセスの環境変数へのポインタを提供します。例えば、名前が始まり「=

  • とどうやらこれは、現在のディレクトリのセットを表現するのWindowsの方法で環境変数を探している、NULLで終わる文字列のこのリストを

  • 反復し、これは、いずれかを見つけていない、とその無益な探求に初期化されていないメモリにオフtrundling決して「c:\mystuff

  • のような値を持つ環境変数「=c:」があるはずです。

  • ブーム。

get_environment_from_os()によって返されたメモリアドレスを検査することは私に、環境変数のかなりまともな探してリストを示しているが、そのキーはいずれも「=」文字で始まりません。

私はまだ正確になぜ、どのように物事がこの状態に入るのかを掘り下げています。それは常に私がスレッドを疑わせるようになるとは思われませんが、あなたのように、私はこれを裏付ける証拠を見つけることができません。私はdistutilsがどのように働くかについての親密な知識は持っていませんが。

0

Aha!謎解き。

https://bugs.jython.org/issue29908を参照してください。基本的にspawnve()は壊れています。 =で始まるこれらの秘密カレントディレクトリ環境変数に依存しており、環境に環境変数が含まれていないとクラッシュする可能性があります。プロセスの起動時に

cmd.exeexplorer.exeは、それらを設定していますが、それらが含まれていない制限された環境でのプロセスを自分で起動した場合、そのプロセス自体が、あなたが土地をクラッシュさせる向かっているspawnve()を呼び出そうと。

回避策は、パターンに一致する環境変数を少なくとも1つ設定することです。例えば=c:=pantsあなたはいいです。

関連する問題