2013-02-26 176 views
0

在過程遷移到現有的32位MFC代碼爲64位,我做了成功的構建,並試圖對代碼進行測試CDialog的:的DoModal崩潰從32遷移後默默地到64位

不幸的是在測試過程中似乎

未按協議棧

hWnd = ::CreateDialogIndirect(hInst, lpDialogTemplate, pParentWnd->GetSafeHwnd(), AfxDlgProc); 
CreateDlgIndirect(lpDialogTemplate, CWnd::FromHandle(hWndParent), hInst) 
CDialog::DoModal() 

不轉儲產生,也沒有發生的例外是越來越受SEH

陷入失敗(而崩潰) 210

我試着比較調試運行與現有的工作Win32調試運行,但無法找到任何顯着差異

在這一刻,我很無能,我應該如何繼續。任何形式的幫助是備受期待

異常信息:在0x000007fefd89a5ed(KernelBase.dll)在xyz.exe 第一次機會異常:0x000:爲0x1234。

實際的問題

企業的實際問題,是由於這是發生導致它崩潰指針截斷。 @ OwenWengered的解決方案確實幫助我找出問題並處理我目前正在工作的所有這種指針截斷。我很幸運:-)

+0

所以32位代碼的作品,對吧?代碼失敗的地方在哪裏?在CDialog :: DoModal()中?順便說一句:對CDialog :: DoModal的調用看起來很奇怪。在您發佈的3行代碼旁邊發佈更多代碼。你有沒有從64位編譯器得到任何警告?嘗試在啓用所有警告的情況下重新編譯。 – 2013-02-26 12:28:28

+2

這是在將32位代碼轉換爲64位時可能會失敗的一件事。通常由將指針存儲爲int或long引起。你將需要調試它。 – 2013-02-26 12:46:50

+2

說您的應用程序在DoModal()中崩潰無助於確定原因。這就像說你的應用程序在main()中崩潰。在異常處設置斷點,以便您可以在發生異常的位置看到本地調用堆棧。對於VS 2008,這有點舊,但它可能有所幫助:http://otb.manusoft.com/2008/05/debugging-objectarx-break-on-exception.htm – 2013-02-27 03:57:46

回答

0

正如HansPassant在評論中已經說過的那樣,除了調試它並追蹤當時應用程序試圖做什麼之外,幾乎沒有什麼可做的。

對於完整的開始,「0x1234」值看起來很奇怪。如果你有源,找到有問題的線並在那裏設置斷點。然後,一旦命中,檢查哪些值(hinst?lpdialogtemplate?pParentWnd?)可能已被修整爲0x1234。在調試會話中,值1234可能會有所不同,因此請小心並檢查任何看起來很奇怪的指針,即。太小或看起來不對齊。

如果您有消息來源,請在周圍(之前!)致電您引用的相關部分。

如果您沒有任何來源,儘量讓他們:)

如果你不能讓他們,那麼你就可以在原始(DIS)的裝配調試,但後來,你需要引用的不僅是主體部分,還有註冊和堆疊的價值觀......好吧,很難得到觀衆的可能性。

很難多說什麼,因爲目前我/我們知道即使你的情況比你少:)

+0

我明白你的觀點。我只是想收集集體經驗來獲得一些提示。關於消息來源,我確實擁有它,但它的知情權讓我在分享它時要小心:-)。我將再次切換回我的調試器並報告我有的任何更新 – Abhijit 2013-02-26 15:41:18

0

我剛做了一個非常類似的問題。與之前一樣,在VS6中進行編碼時,您可以創建一個清單文件(在資源下)來更改對話框的外觀,使它們具有WinXP對話框外觀(帶圓邊)。

https://msdn.microsoft.com/en-us/library/aa289524%28v=vs.71%29.aspx

所以我有一個RT_MANIFEST下資源稱爲IDR_WIN_XP_THEME文件。

我能夠升級到所有版本的Visual Studio。但是當我在VS2015中將應用程序轉換爲64位並嘗試以64位打開應用程序時,它失敗並出現異常錯誤。

異常在0x000007FEFC94965D(KernelBase.dll)拋出

我剛剛刪除的IDR_WIN_XP_THEME清單文件,並開始工作。