2012-06-07 3 views
3

WinDBG를 사용하는 JNI를 통해 Java 기반 프로세스를 진행하는 C++ 구성 요소에서 액세스 위반 오류를 디버깅하려고합니다. 가 나는 현재 직면 두 가지 문제가 있습니다 :JNI 모듈에서 특정 액세스 위반 디버깅

  1. 자바 자체는 (적어도 그게 보인다 방법) 일부 내부 스레드 동기화 해 할 첫 번째 기회가 액세스 위반 예외를 사용, 그래서 난 그냥 모든 1 세대에서 분리 할 수 ​​없습니다
  2. 예외 (자바 버그 데이터베이스이 의도 행동, 그래서 우리는 기대하지 말아야 어떤 수정에 따라) 기회가 액세스 위반은 현재

(즉, C++ 코드의 오작동에 대해 생산 환경을 보호해야) 외부 코드에서 처리됩니다 자바의 AV와 ​​광산을 구분할 수있는 한 가지 방법을 발견합니다. 로드 된 심볼이없는 모듈에 속한 주소 나 메모리의 다른 지점에있는 심볼을로드하고 심볼이로드 된 위치에서 발생하는 AV를 catch하는 데 관심이 있습니다.

내가 WinDbg는 그것을 달성하는 방법에 대한 모든 요소가 보인다, 그러나 함께 조립 수 없습니다

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

문제는 내가 .if 문에 ln 명령의 입력을 지정할 수 없습니다입니다 (표현식을 기대하기 때문에) 또한 ln의 출력이 비어 있는지 확인하는 방법을 모르겠습니다.

답변

4

흥미로운 사례! 나는 ln을 사용하여 출력이 끔찍할 것이라는 점을 생각한다. (그리고 어떻게 할 지 모른다.) 약간 다른 접근 방법 : 의사 @의 $의 IP가 높은 값에 .DLL 년대의 기본로드 주소를 변경하려면 예외

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

사용 rebase utility의 주소를 포함하고 그들은 모두 거기로드 희망한다 . 우리는 jvm.dll을로드하고 그것으로 호출하는 네이티브 C++ 서비스를 @ $ IP> "RebaseAddr"

0

을 :

그런 다음에 테스트 할 수 있습니다. 다행히도 그들은 다행히도 항상 jvm.dll 안에있는 서로 다른 두 가지 명령어를 사용했기 때문에 sxe -c ".if (@eip == <addr1>) || (@eip == <addr2>) {gn}" av을 사용하면 저에게 효과적입니다.