2012-06-07 46 views
3

我試圖通過JNI和WinDBG在基於Java的服務進程中運行的C++組件中調試訪問衝突錯誤。 有我目前面臨兩個問題:在JNI模塊中調試特定的訪問衝突

  1. Java本身使用了第一次機會訪問衝突異常做一些內部的線程同步化(至少這是怎麼好像),所以我不能只在所有一線突破機會訪問衝突(根據Java的漏洞數據庫,這是預期的行爲,所以我們不應該指望任何修復)
  2. 異常外碼的處理(即應該保護生產環境免受C++代碼行爲不端)

目前我看到了一種區分Java的AV和我的方式 - Java是偶然的在屬於沒有加載任何符號的模塊或存儲器的任何其他位置的地址處,並且我有興趣捕獲在具有符號加載的地方發生的AV。

好像我對如何使用WinDbg來實現它的所有元素,但不能聚集在一起他們:

sxe -c ".if (ln) {gN}" av

問題是我不能。如果語句中指定ln命令的輸入(因爲它期望表達式),並且我不確定如何檢查ln的輸出是否爲空。

回答

4

有趣的案例!我認爲使用ln並檢查輸出會非常慢(並且不知道怎麼做)。稍微不同的方法: 僞@ $ IP應該包含異常

First chance exceptions are reported before any exception handling. 
<cut cut > 
eip=0041625d 
0:000> r @$ip 
$ip=0041625d 

使用rebase utility的地址,以便爲您的.dll的更改默認加載地址到一個較高的值,並希望他們都裝起來有。

然後你就可以測試:@ $ IP>「RebaseAddr」

0

我們有一個加載的jvm.dll並調用它原生C++服務。從它的AV噸:-(幸運的是,他們總是從jvm.dll裏面最多兩個不同的指令,所以我做sxe -c ".if (@eip == <addr1>) || (@eip == <addr2>) {gn}" av,這對我很有用。