3

我維護用VB6編寫的舊應用程序。在客戶端環境中,它引發了運行時錯誤,我無法在調試器下重現這些錯誤。有沒有辦法獲得堆棧跟蹤或錯誤的位置?運行時錯誤堆棧跟蹤或VB6中的位置

我的意思是,不要在整個代碼中添加跟蹤語句,如here或添加錯誤處理程序以記錄到每個過程,如here

這似乎是一個簡單的問題。 對不起。 我只是不太瞭解VB6。 考慮到它使用的廣泛程度(或曾經使用過的程度),出乎意料地很難將任何信息穀歌出來。

+0

我問過同樣的問題http://stackoverflow.com/questions/127645/is-it-possible-to-retrieve-the-call-stack-programmatically-in-vb6我相信它可以不行。 – raven 2009-07-08 18:35:34

+0

也許我不清楚。我有一個在遠程位置生產的應用程序。我沒有訪問這個系統,我不能在那裏運行調試器。他們的環境中有些東西會觸發運行時錯誤。我不能指望他們的IT人員(更不用說常規用戶)真正地幫助,除了向我發送任何顯示或轉儲的日誌文件之外。我需要一些工具,儀器或任何東西,這將幫助我從他們那裏獲得有意義的輸入。是 - 如烏鴉寫道 - 在每個例程中寫一個「On Error GoTo/Reraise/LogError」是唯一的方法? – 2009-07-09 15:28:33

+0

那麼,你可以用我提到的調試符號進行編譯,然後讓它們在發生錯誤時執行內存轉儲。然後您將能夠加載內存轉儲,並希望使用Visual Studio獲取堆棧跟蹤。 – Ant 2009-07-10 08:57:21

回答

3

嘗試編譯爲pcode,看看你是否仍然有錯誤。這是VB6的調試模式和運行時間之間的一個常見區別。我曾經編譯爲本機並且遇到僅在運行時發生的錯誤。當我切換到pcode時,發現錯誤消失了,或者更可能出現新的錯誤,這些錯誤反映了真正的問題,並且在調試模式下更容易再現。

如果儘管你仍然得到錯誤,那麼我真的建議你從你的程序堆棧的頂部和使用的

On Error Goto Handler 
<code> 
Exit <routine> 
Handler: 
Err.Raise Err.Number, "(function_name)->" & Err.source, Err.Description 

Maero的建議這是一個痛苦的工作,你一路下滑,但有沒有真正的方法周圍。

1

這已經有一段時間了,但我不認爲有一種方法可以在VB6應用程序中獲取堆棧跟蹤,而無需添加錯誤處理程序並輸出相應的消息。有一些第三方工具會將錯誤處理添加到整個應用程序,但我相信它只是在整個代碼中添加了「On Error Goto」錯誤處理程序。

就像在旁邊一樣,我在VB6應用程序中遇到的一個更隱祕的運行時錯誤是當我使用客戶端PC上不存在的控件屬性中的字體時。這產生了一個不能被代碼困住的運行時錯誤,所以我添加的錯誤處理量都沒有發現錯誤。我偶然碰到了它。希望這可以幫助。

2

如果在「項目屬性/編譯」選項卡上選中「創建符號調試信息」複選框,則可以像使用本機C++應用程序一樣在Visual Studio中進行調試。

3

VB6調試器有時是片狀的。有替代品。

  • 您可以嘗試Windbg,這是一款來自Microsoft的免費獨立調試器。編譯你的VB6時不需要優化和「創建符號化調試信息」(即創建PDB文件),你就可以進行調試。這是微軟一位關於在VB6中使用Windbg的2006 blog post,以及另一位微軟傢伙對012b的簡短介紹。
  • 您也可以使用帶有VB6和PDB文件的Visual Studio 2008調試程序,例如與Visual C++ Express Edition(這是免費的)。有關更多詳細信息,請參閱this
  • Windbg和Visual Studio expect源代碼在調試機器上與VB6構建時的構建機器上的路徑完全相同。最簡單的方法是在同一臺機器上構建和調試。否則,您可能需要fiddleSUBST來創建虛擬驅動器 - 或者我被告知認真的方法是使用Symbol Server