【问题标题】:native sqlite library crashes in with c++/cli本机 sqlite 库在 c++/cli 中崩溃
【发布时间】:2012-12-10 15:34:46
【问题描述】:

短篇小说

在为支持公共语言运行时的 X64 平台编译 C++ 应用程序并使用其中的原生 sqlite 库时,应用程序在 sqlite3MemRealloc 内崩溃,试图分配大量内存(大约 5GB)。

在没有 CLR 支持的情况下编译相同的应用程序时,所需的功能可以正常工作,并且不会尝试分配此数量的内存。我设置了一个带有条件的断点来验证这个事实。

数据库本身是一个 800KB 的小文件,我们正在尝试运行一个简单的“select * from XYZ”查询。使用我们代码库中现有的 sqlite 3.7.11 和最新的 sqlite 3.7.14 进行了尝试。

这个问题是一致的。无论我重建应用程序或使用某些设置多少次 - 如果支持 CLR,它会崩溃,如果不支持 CLR,它会正常工作。

更长的故事

我试图开发一个应用程序,该应用程序利用现有 C++ 编写的代码库中的代码,同时也利用 .NET 框架的强大功能。

我创建了一个 C++/CLI 应用程序,该应用程序链接到现有代码(其中使用了 sqlite)。我的代码不直接使用 sqlite。使用 sqlite 的现有代码是其余代码库所依赖的本机 C++ 库。所以我不能轻易触摸它,因此不能简单地使用 System.Data.Sqlite。

我通过删除对 .NET 框架的所有依赖项并创建一个简单的应用程序来隔离这个问题,该应用程序只使用现有的本机代码而不使用任何 .NET 框架代码,并编译两次 - 有和没有 CLR 支持。

【问题讨论】:

  • 哎哟。崩溃是否取决于数据库的内容?您是否尝试过仅使用 /clr 编译几个文件以尝试缩小问题发生的范围?
  • 是的,我尝试使用 /clr 仅编译所需的文件。还是一样。关于依赖性 - 我想它确实依赖于它,但我无法隔离问题。我尝试了我们公司的许多数据库,但仍然发生。数据库本身是由公司的另一个部门创建的,我无法控制。

标签: visual-c++ sqlite c++-cli clr


【解决方案1】:

最终,通过使用 memsys5 内存分配器编译 SQLITE 并将其配置为在启动时使用它,最终解决了该问题。当它不依赖于 MSVCRT 内存分配而是依赖于它自己的内部分配策略时,一切正常。

似乎由于某种神秘的力量,CLR 的存在干扰了 MSVCRT 的内存分配功能。

更多信息可以在here找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2016-12-17
    • 1970-01-01
    相关资源
    最近更新 更多