2012-12-10 81 views
0

短篇小說本地SQLite庫崩潰與C++/CLI

當編譯爲X64平臺的公共語言運行庫支持C++應用程序,並使用它裏面的本地SQLite庫,裏面sqlite3MemRealloc應用程序崩潰,試圖分配大量的內存(大約5GB)。

當同一個應用程序在沒有CLR支持的情況下被編譯時,所需的功能就可以工作,並且不會嘗試分配這些內存量。我用一個條件來判斷這個事實。

數據庫本身是一個小型的800KB文件,我們正試圖運行一個簡單的「select * from XYZ」查詢。試用了我們在我們的代碼庫和最新的sqlite 3.7.14中已有的sqlite 3.7.11。

此問題是一致的。無論我重建應用程序多少次,或者使用某些設置進行播放,CLR支持都會崩潰,而不支持CLR支持。

較長的故事

我試圖開發從C語言編寫的現有代碼庫利用代碼的應用程序+ +,但也充分利用了.NET框架的力量。

我創建了一個與現有代碼鏈接的C++/CLI應用程序(利用它內部的sqlite)。我的代碼不直接使用sqlite。使用sqlite的現有代碼是其餘代碼庫所依賴的本機C++庫。所以我不能輕易觸摸它,因此不能簡單地使用System.Data.Sqlite。

我通過刪除.NET框架的所有依賴關係並創建一個簡單的應用程序,只使用現有的本機代碼而不使用任何.NET框架代碼,並編譯它兩次(帶和不帶CLR支持)來隔離此問題。

+0

Ouch。崩潰是否依賴於數據庫的內容?您是否嘗試過使用'/ clr'編譯只有幾個文件來試圖縮小問題發生的位置? –

+0

是的,我試圖用/ clr只編譯所需的文件。還是一樣。關於依賴 - 我想它依賴於它,但我無法孤立這個問題。我嘗試了很多數據庫在我們公司,它仍然發生。數據庫本身是由我無法控制的公司中的不同部門創建的。 – Alex

回答

0

最終,問題是通過編譯帶有memsys5內存分配器的SQLITE並將其配置爲在啓動時使用它解決的。當它不依賴於MSVCRT內存分配而是依靠其自己的內部分配策略時,一切都奏效了。

看來,由於某種神祕的力量,CLR的存在會干擾MSVCRT的內存分配功能。

更多資訊可瀏覽:here