gpt4 book ai didi

python - 如何调试它从 Windows 库 ucrtbase 抛出的访问冲突?

转载 作者:太空宇宙 更新时间:2023-11-04 03:25:45 29 4
gpt4 key购买 nike

我的应用程序(基于 Java)启动了适用于 Windows 的 python,而后者又调用 os.spawnv 来启动另一个 python。

有时我遇到访问冲突异常。

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]

我在 c:\build\cpython\modules\posixmodule.c @ 5299 上设置了 bp,这是我在 python 源代码中看到的

Py_BEGIN_ALLOW_THREADS
spawnval = _spawnve(mode, path_char, argvlist, envlist);
Py_END_ALLOW_THREADS

我已经检查了所有参数两次:它们没问题。 mode 是 0,path_char 是我的 interpeter 的路径,argvlistenvlist 都是 char** :以 NULL 结尾的字符串的以 NULL 结尾的数组。

所以,这不是 python 的错。

我知道_spawnve 不是线程安全的,但只有一个线程。

我没有 MS ucrtbase 的源代码或私有(private)符号。调查它的正确方法是什么?

--

ucrtbased.dllucrtbase.dll 有什么区别?我是否应该针对 ucrtbased.dll 编译 Python 以查找更多符号?

最佳答案

啊哈!谜团解开了。

参见 https://bugs.jython.org/issue29908有关详细信息,但基本上 spawnve() 已损坏。它依赖于这些以 = 开头的 secret 当前目录环境变量,如果环境不包含它们,则可能会崩溃。

cmd.exeexplorer.exe 在启动进程时设置它们,但是如果您在不包含它们的受限环境中自行启动进程,那么进程本身会尝试调用 spawnve() 你正前往坠毁之地。

解决方法是设置至少一个与模式匹配的环境变量;例如=c:=pants 你很好。

关于python - 如何调试它从 Windows 库 ucrtbase 抛出的访问冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41194641/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com