2012-02-23 72 views
0

我處理目前一個非常奇特的問題:我有一個應用程序,在調試-Buildmode充分的工作,無論是我從MSVC環境中運行或啓動生成的可執行自己。如果我在Release-Buildmode中構建這個應用程序,當我從MSVC環境運行它時它已經完全工作,但是當我自己啓動它時會顯示意外的行爲。差異和發佈環境

調試和發佈模式之間的區別可能是此行爲的原因,以及爲什麼只有在手動啓動可執行文件時纔會出現這些問題?

很難給代碼,因爲這是一個相當大的項目,我絕對沒有什麼線索,可能會造成問題。該程序流程基本上是:從文件

  • 讀取設置(不是問題,雙重檢查讀取值,並使用ini-和libconfig ++ - 庫可以肯定的)
  • 分配值,以單獨的類(雙重檢查傳遞的值)
  • 其中一個類啓動一個線程(boost::thread),並觸發某些事件的回調函數(如果是手動執行的發佈版本這些不觸發)

的東西,我能想象的威力造成問題,但我不知道的:

  • 由於各個班級由不同的人寫的,還有的std::stringstd::wstring用法不一致。我使用std::wstring(s.begin(), s.end())從一個轉換到另一個,反之亦然。

這可能是我的問題的原因,如果是的話,我該如何解決這個問題?我非常感謝這方面的幫助。提前致謝。

更新:

  • 程序不崩潰和變量似乎並沒有當我使用臭名昭著的打印調試方法(因爲在調試器中一切順利罰款)有不同的值
  • 我已閱讀,未初始化變量可能會造成這個問題,並通過triplechecked我使用的每個變量,每個變量正確初始化
  • 在單元測試中,我使用的作品如預期(雖然我不知道我得到了每個模塊因爲我有,每次都有正確的邊界案例e不是自己寫的所有模塊)。

更新2:

  • 同時禁用一步優化步驟和使釋放buildmode接近調試buildmode我能夠縮小問題下:**在代碼生成選項卡,我的程序與Multithreaded-Debug-DLL,而不是Multithreaded-DLL,無論優化設置。

這似乎是一個很好的成就,但我缺乏對這個問題的理解。

+0

究竟是什麼問題?程序崩潰了嗎?你有沒有嘗試找到觸發這些事件的代碼?你是否修復了完全字符串不一致? – 2012-02-23 11:28:49

+0

通常這是一個未經初始化的變量,取決於程序的啓動方式,它會得到不同的隨機值。 – 2012-02-23 11:29:16

+0

@Bojan Komazec你是什麼意思與「固定完全字符串不一致」?如上所述,我必須將std :: string轉換爲std :: wstring幾次。 – nijansen 2012-02-23 11:57:28

回答

1

添加日誌記錄或消除一些代碼塊。這應該允許找到問題出現的地方。對於差異看這裏:

What is the difference between Debug and Release in Visual Studio?

+0

我已經實現了日誌記錄功能,但不幸的是我無法確定問題出在哪裏。我會盡量去除目前所推薦的所有內容。 查看調試/版本差異時,我想知道爲什麼只有在手動執行應用程序(不在MSVC調試器中)時出現此問題。這可能是由優化引起的嗎? – nijansen 2012-02-23 11:53:36

+0

不知道問題的原因是什麼,使用日誌記錄時使用二進制搜索規則:在代碼中間的某處添加日誌記錄,並檢查它是否顯示,如果是,則在前半部分中間添加日誌記錄等等。您也可以嘗試向您添加調試信息發佈項目並從調試器啓動它,同時禁用優化。 – marcinj 2012-02-23 12:02:52

1

調試不使用的優化也有在這就是爲什麼exe文件大小是不同的釋放模式的優化。即使使用相同的代碼,使用的庫也不同。您可以通過關閉優化選項來釋放調試版本。