2011-05-16 51 views
2

我正在使用傳統的VB6應用程序。在一定的使用情況下,應用程序失敗的東西,它看起來像一個空指針異常:將彙編代碼映射到VB6代碼

指令在「0x2982e900」 引用內存「0x00000156」。 內存不能被「讀取」。

我試圖做一些源代碼調試,但我找不到引發異常的源代碼行。有沒有辦法找到對應於彙編指令地址的源代碼行,例如0x2982e900? (我試過Reflector,但它似乎只支持.NET)。

更新:

當調試與VB6 IDE調試器的應用程序,我沒有得到在VB6源的任何中斷。相反,上面提到的Windows錯誤消息彈出,給我選擇啓用Visual Studio 2010調試器。如果我這樣做,VS2010調試器顯示的彙編代碼是這樣的:

[...]
2982E8FA推EAX
2982E8FB呼叫29832E9B
2982E900 MOV AX,單詞PTR [EAX + 156H]

該應用程序使用一個名爲Infragistics的公司的一些.ocx文件來實現GUI。根據CrashFinder實用程序,顯示的彙編代碼來自文件IGTOOLBARS40.OCX

+2

你有應用程序的原始源代碼? (看起來你必須,因爲你說你在應用程序上「工作」。)如果是這樣,請嘗試從VB 6 IDE運行它,以便連接內置的調試器。這應該在Windows執行之前捕獲錯誤,並且至少報告導致問題的行。用這行更新你的問題應該讓你對如何解決它有一些快速的想法。 – 2011-05-16 13:34:17

回答

3

與受管理的.Net代碼類似,VB6代碼不會遇到無效指針異常(因爲VB6不包含指針)。

的問題很可能是由兩種

  • 在DLL或OCX的bug(可能是第三方嗎?)
  • 一個錯誤在調用Windows API造成的。通常通過Declare聲明,有時通過類型庫(hard-core!)。

第一步是確定哪一行VB6代碼觸發崩潰。

或者:

  • 通過直至崩潰發生的IDE步驟。
  • 或者將0x2982e900地址解碼爲帶有CrashFinder的VB6源碼行號。你做總是建立你的EXE與PDB file其中包含debug symbols,對吧?

    要告訴VB6 IDE使用調試信息構建項目,您需要更改其中一個默認編譯選項。從文件菜單中選擇「生成Project1.exe」。單擊出現的保存文件對話框中的「選項」按鈕,將打開屬性表。切換到「編譯」選項卡,並選中標有「創建符號調試信息」的框。

          Ensure that "Create Symbolic Debug Info" is checked in your build settings

+0

請原諒我的無知,但什麼是PDB,以及如何編譯我的可執行文件(VB6,即)? – 2011-05-17 07:36:30

+0

@Brian:更新了有關PDB的更多信息並從VB6生成它們的答案。這當然是一個可行的發現途徑,但我認爲使用VB6 IDE瀏覽代碼可以更容易地查看違規行。對於普通的VB程序員來說,瀏覽調試符號是非常棘手的,我想爲什麼這個選項默認是禁用的。 – 2011-05-17 07:54:52

+0

@Cody,@MarkJ,謝謝你。我認爲,你是對的,最好是在IDE中逐步完成代碼,但不會因爲其他事情而嘗試。 – 2011-05-17 08:12:54

1

您可以嘗試使用反彙編程序(如IDA Pro)對應用程序進行逆向工程。