dll在使用memset时导致Python崩溃

Posted

技术标签:

【中文标题】dll在使用memset时导致Python崩溃【英文标题】:Dll causes Python to crash when using memset 【发布时间】:2016-03-11 15:29:41 【问题描述】:

我一直在从事一个项目,我试图在 Python 中使用一个用 C++ 编写的旧 CodeBase 库。我想要的是使用 CodeBase 重新索引具有 .cdx-index 的 .dbf 文件。但目前,Python 在运行时崩溃。后面会有更详细的解释。

至于 Python,我使用 ctypes 加载 dll,然后执行我自己添加的函数,这应该不会导致任何问题,因为它不使用 CodeBase 本身未使用的单行代码。 Python代码:

import ctypes  
cb_interface = ctypes.CDLL("C4DLL.DLL")  
cb_interface.reindex_file("C:\\temp\\list.dbf")  

这是我添加的 CodeBase 函数,但它需要一些我现在无法提供的知识,而不是把这个问题搞砸了。如有必要,我将尽我所能提供进一步的见解:

S4EXPORT int reindex_file(const char* file)
    CODE4 S4PTR *code;
    DATA4 S4PTR *data;

    code4initLow(&code, 0, S4VERSION, sizeof(CODE4));
    data = d4open(code, file);
    d4reindex(data);

    return 1;

根据我自己的调试,我的问题发生在code4initLow。当 dll 到达以下代码行时,Python 崩溃并显示“python.exe 已停止工作”的窗口:

memset( (void *)c4, 0, sizeof( CODE4 ) ) ;

这里的c4 与前一个代码块中的代码是同一个对象。

在运行时尝试更改内存的 dll 是否存在问题?如果我从我的 python 脚本创建一个 .exe 文件,会不会是一个 python 问题?

如果有人可以回答我这些问题和/或为我的 python 崩溃问题提供解决方案,我将不胜感激。

最后但同样重要的是,这是我在这里的第一个问题。如果我不小心在这里违反了书面或不成文的规定,我深表歉意并承诺尽快解决。

【问题讨论】:

【参考方案1】:

首先,指针code 没有指向任何地方,因为它未初始化。其次,您实际上并没有尝试填充结构,因为您将 memset 传递了一个指针到指针

您可能应该做的是将code 声明为普通结构实例(而不是指针),然后在将其传递给d4open 时使用&code

【讨论】:

【参考方案2】:

就像 Joachim Pileborg 所说的问题是,将 Nullpointer 传递给 code4initLow。 ("Alternative") 解决方案是为结构CODE4 S4PTR *code = (CODE4*)malloc(sizeof(CODE4));分配内存,然后像code4initLow(code, 0, S4VERSION, sizeof(CODE4));一样传递指针。

【讨论】:

以上是关于dll在使用memset时导致Python崩溃的主要内容,如果未能解决你的问题,请参考以下文章

使用挂钩函数时应用程序崩溃

boost::python::exec(anything) 调用时崩溃

发布版本因 msvcp120d.dll 崩溃

从 C# windows 应用程序调用 C dll 会导致 svchost.exe 崩溃

根据代码顺序,挂钩 sendto() 会导致崩溃

库中静态分配的 zlib 字节数组上的 memset 使 Objective-C++ 程序崩溃