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

2024-06-26 00:19:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我的应用程序(基于java)启动pythonforwindows,然后调用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源代码中看到的内容

^{pr2}$

我检查了两次所有的论点。mode是0,path_char是指向我的interpeter的路径,argvlist和{}都是{}:以NULL结尾的空字符串数组。在

所以,这不是python的错。在

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

我没有msucrtbase的来源和私有符号。什么是正确的调查方法?在

ucrtbased.dll和{}之间有什么区别? 我应该编译Python吗基于ucrtbased.dll找到更多的符号?在


Tags: pathbuildmodulesobjectosmodecommoncpython
2条回答

我刚刚在尝试构建SciPy时遇到了相同的问题;访问冲突作为设置.py正在尝试spawnve()一个C编译器。在

我还没搞清楚,但至少在我的情况下,我已经完成了拆卸工作。发生的情况如下:

  • 调用get_environment_from_os(),它为您提供指向当前进程环境变量的指针。

  • 迭代此以空结尾的字符串列表,查找名称以“=”开头的环境变量

  • 显然,这是Windows表示当前目录集的方式,例如,应该有一个环境变量“=c:”,其值类似“c:\mystuff

  • 它再也找不到任何东西,在徒劳的探索中慢慢地进入未经初始化的记忆中。

  • 轰隆隆。

检查get_environment_from_os()返回的内存地址显示了一个非常正常的环境变量列表,但是没有一个环境变量的键以=字符开头。在

我仍在深入研究为什么事情会进入这种状态;它似乎并不总是会发生,这让我怀疑线程,但和你一样,我找不到任何证据来支持这一点;尽管我对distutils是如何工作的还不太了解。在

啊哈!谜底解开了。在

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

cmd.exeexplorer.exe在启动进程时设置它们,但是如果您自己在一个不包含它们的受限环境中启动一个进程,那么该进程本身会试图调用spawnve()您正走向崩溃边缘。在

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

相关问题 更多 >