2016-08-18 58 views
-1

我有一個非常簡單的應用程序,它解析一些文本文件並將記錄插入到SQL Server數據庫中。缺少應用程序的依賴關係?

「這對我的作品」,但它崩潰以下行,在另一臺機器上運行:

cmr->dateTimeStamp = TIMESTAMP_STRUCT { }; 

這對我來說,意味着有相關要麼TIMESTAMP_STRUCT缺少的依賴,因爲這是隻有那一行中沒有出現過,在程序中。

TIMESTAMP_STRUCT和SQLUSMALLINT在sqltypes.h中定義,它們只是typedefs,所以我不希望那裏有任何依賴關係。

我已經在目標機器上安裝了SQL Server本機客戶端11和visual C++運行庫。

我還能遺漏什麼?

Visual Studio 2015,目標機器是Windows Server 2008 R2。

我在兩臺機器上使用相同的輸入文件,但它只在一臺機器上失敗。

+0

難道不可能把它分解成碎片以找出哪個部分會導致問題?是否有可能實現異常處理來捕獲錯誤並更優雅地退出應用程序? – techspider

+0

'cmr'可能是先前錯誤的NULL。通過安裝遠程調試器(在應用程序崩潰的機器上)並從開發機器遠程調試到測試/發佈機器來查找錯誤。僅供參考:對於缺失的依賴關係,您將得到一個很好的對話,告訴您確切的缺失。 –

+0

C API中的例外很多時候都有誤導性的描述。我有時使用MFC層,有這樣的prblems。你有什麼特別的例外? –

回答

0

問題歸結爲編譯器標誌。

該項目開始作爲玩具應用程序的東西完全不相關,它有AVX說明。當它成爲一個「真正的」應用程序時,針對該指令集的標誌從未取消設置。

刪除該編譯器標誌(/ arch:AVX)可使程序在兩臺機器上都能正常工作。 對我來說很奇怪的是,在這個程序中還是沒有AVX指令,那麼爲什麼這個標記會導致兩臺機器之間執行的差異,特別是對於初始化一個由基本類型組成的結構體這樣的良性的東西呢?

+0

你是如何確定這一點的?你看過阿西碼嗎? – doug

+0

確定具體是什麼? – dodexahedron

+0

玩具應用程序中有AVX指令,因爲我把它們放在那裏。我正在測試它對特定代碼段的影響。我怎麼知道編譯器標誌影響了當前的應用程序?因爲我曾經在旗幟上跑過一次,並在旗幟關閉時跑過一次。我如何知道當前應用程序中沒有AVX指令?那麼,我想我不會,如果編譯器只是因爲設置了該標誌而機會使用它們。但是,我沒有看到它會在哪裏以及如何使用它,並且VS的程序集輸出沒有顯示任何AVX指令,所以我很茫然。 – dodexahedron