2011-10-05 123 views
0

我在OSX 10.7(Lion)上遇到Microsoft Office for Mac 2011中無處不在的EXC_BAD_ACCESS錯誤。最新的辦公更新安裝(14.3我相信這是)EXC_BAD_ACCESS「Office for Mac 2011」Excel宏MicrosoftOleautomation調試原因

我正在運行一個(相當大)的宏...從PC Office移植它。

將元素添加到集合時發生錯誤。沒有什麼花哨,並且在沒有問題的情況下也可以在其他數十個地方使用。 (並沒有從工作PC版本中修改它)。所以,雖然這可能是錯誤的關鍵,但我懷疑它與集合的內存有關 - 例如,也許它在這個特定的插入過程中在幕後執行realloc。

特別是,它將第二個元素插入到集合中。沒有用戶定義的類型。沒什麼特別的。添加一個字符串元素。插入的數據是猶太教。密鑰ID是唯一的。麪包和黃油收集使用。

另一個可能的嫌疑人可能是變量作用域(???)...也就是說,它可能使用了另一個子程序中類似命名的變量或者古怪的東西。

或者可能在子程序中使用的臨時字符串是名義上的罪魁禍首?

如果我出注釋此行,宏其餘運行好(除了丟失的數據從容器毛刺所以這沒關係處理......這可在正常運行空)

我尋求如何追蹤問題的建議。並解決它的提示。

Mac上的內存頁面64k就像它在PC上一樣嗎?

它可能是物理內存/虛擬內存/交換? (看起來與系統操作系統相關的過於一致)

也許excel對宏有內存限制上限?

如何利用異常時的核心轉儲來追蹤問題?

(有經驗的程序員,只是不熟悉OSX ......而丟失了所有我的PC開發工具嘆息

回答

0

解決。

這不是集合。

通過一些「printf」調試,追蹤了這個問題。或者至少找到了解決方案。

以下是對發生了什麼的推測。

早些時候的變體陣列創建,填充,並傳遞到子程序...

Dim nameList(50) As Variant 
... populated ... 
Call SomeSub(nameList) 
... 
sub SomeSub(nameList) 

在子,所述變體陣列是使用迭代然後一個「對於每一個」環路(墜毀)

For outerLoopIndex=0 To 100 

    Dim currName 
    For Each currName In nameList 
     If testName Like currName Then 
      addToBucket = True 
      Exit For ' skip any others since found a site of interest 
     End If 
    Next currName 

Next outerLoopIndex 

它在外環的第一遍上正常工作。但是,數據會受到損壞,因此在第二次通過外部循環時發生EXC_BAD_ACCESS崩潰。

「修復」是顯式聲明爲Variant:

Dim currName As Variant 
    For Each currName In nameList 
     ... 

或許這將幫助其他人遇到類似的問題。嘗試顯式聲明變量。 Mac Excel似乎對這些事情更敏感。 :)