2017-10-24 3 views
0

우리 제품에서 이상한 행동을 한 마디 씩 겪었습니다. (몇 분에서 몇 일간의 레인저), 우리의 로그 (일반적으로 우리의 특정 로그를 작성하는 간단한 .txt 파일)는이 메시지를 보여줍니다 : 가 처음 충돌로보고했지만, 분명히 충돌하지 않고, 단지 때때로 로그에이 인쇄 - 그 외에는로그에만 나타나는 첫 번째 예외를 찾는 방법은 무엇입니까?

****************************************************** 
****** Warning - First Chance Exception Caught! ****** 
****************************************************** 
Process Name  : C:\OurApp.exe 
Process ID   : 27396 
Thread ID   : 21616 
Debugger Time  : 11:45:34.073 24/10/2017 
Exception Code  : 0xC0000005 - EXCEPTION_ACCESS_VIOLATION 
Exception Desc  : The thread tried to read from or write to a virtual address for which it does not have the appropriate access. 
Extended Desc  : The thread attempted to read inaccessible data. 
Extended Desc 2 : Virtual address of inaccessible data 0xC 
Exception Address : 0x100517E2 
Resolved Address : <no module> (No symbol) [0x100517E2] 
Stack Trace  : 

    <no module> (No symbol) [0x85C5A7D8] 
    Frames below may be incorrect and/or missing (symbol not found) 

****************************************************** 

은 특별한 행동은 눈에 띄지 않습니다. 그것은 우리 로그 중 하나가 아니며,이 경고는 코드 파일에 없습니다 (특정 프로젝트뿐만 아니라 전체 repo를 스캔했습니다). 로그 수준에 관계없이 인쇄됩니다.
어떤 문서에서도이 메시지를 찾을 수 없습니다. (우리의 응용 프로그램은 C#으로 작성되었지만 C++/Java로 작성된 모듈을 가져올 수 있습니다.) 이제는 어떻게 범인을 찾았는지 잘 모르겠습니다. 어떻게 이런 일이 일어나지 않게 할 수 있습니까? OurApp.exe가 생성 한 프로세스가이 로그를 로그에 기록합니다 (procmon을 사용하여 확인).
아이디어는 어떻게 만들어지며 어떻게 멈추는 지 알 수 있습니까?

+0

질문 : [사용자 계정 컨트롤] (https : //en.wikipedia.org/wiki/User_Account_Control)이이 응용 프로그램을 실행중인 컴퓨터에서 켜져 있습니까? – gmiley

+0

@gmiley 예, 있습니다. –

+0

사용하지 않도록 설정해도 되나요? 프로덕션 환경에서이 변경을 수행 할 수없는 경우 다른 환경에서 문제를 재현 한 다음 사용하지 않도록 설정하여 문제가 해결되는지 확인하십시오. 이 문제를 다루는 [다음은 기사입니다] (https://www.java.com/en/download/help/exception_access.xml). 또는 관련된 모든 소프트웨어 (라이브러리/드라이버/등)가 최신 UAC 호환 버전으로 업데이트되도록 할 수 있습니다. – gmiley

답변

0

첫 번째 예외 일 뿐이며 관련 부정적 증상이없는 한 괜찮을 것입니다.

이것은 Windows의 운영 체제 기능인 SEH (Stuctured Exception Handling) "First Chance Exception"입니다.

SEH를 사용하면 예외 필터 (일반적으로 C 또는 C++ 코드)에서 스택을 풀지 않고 "첫 번째 기회"예외로부터 복구를 시도 할 수 있습니다.

예외 필터가 복구를 제공하지 않으면 예외는 결국 C++, Java 또는 C# 예외처럼 "throw 된"결과를 가져옵니다.

첫 번째 사용시 코드 또는 데이터를 초기화하는 방법으로 OS 레벨 코드 (또는 원시 코드 라이브러리)에서 처음으로 0xC0000005 예외가 사용되는 것은 아주 정상입니다. 예를 들어 지연로드 DLL에 사용됩니다. 첫 번째 예외가 발생하는 함수를 처음 호출하면 예외 필터가 DLL을로드 한 다음 OS에 다시 시도하도록 지시합니다.

심령 디버깅 :

당신은 아마이 작업을 수행 어딘가에 코드를 가지고 :

intptr LogException(LPEXCEPTION_POINTERS pep){ 
    // Log the exception 
    return EXCEPTION_CONTINUE_SEARCH; 
} 

__try{ 
    // Some code 
} 
__except(LogException(GetExceptionInformation())){} 

당신은 아마 예외 기록에서 더 많은 정보를 추출하기 위해 "LogException"를 향상시킬 수 있습니다.

당신은 이미 확장 된 데이터의 일부를 검색 할 수 있습니다.

구체적인 경우 오류가있는 주소는 0xC 인 것으로 보입니다. 그것은 센티널 값일 수 있지만 null 포인터를 통해 C++ 객체를 호출 한 것처럼 의심스럽게 보입니다.

더 많은 것을 생각해 보면, 모듈이없고 기호가 없다는 사실은 이것이 자바 또는 C#에 속하는 JIT 편집 코드임을 암시합니다. 그렇다면 JNI 또는 P/Invoke 메서드 중 하나에서 배열이나 구조체를 사용해야 할 때 null 포인터를 전달하거나 null 포인터를 반환했을 가능성이 있습니다 (그러나 COM 메서드 일 수도 있음).

+0

자세한 코멘트를 가져 주셔서 감사합니다! 내가 언급 한 Structured Exception Handling에 대해 좀 더 자세히 읽을 것입니다. 내가 말했듯이이 프로그램은 다른 증상없이 잘 작동하지만이 로그와 내가 본 것까지 모든 가능한 예외는 결국 어떤 방식 으로든 처리됩니다. 그래도이 문제를 정상적으로 종료하려면 문제의 근본 원인을 찾아야합니다. 결국 특정 OS 호출 인 경우에도 마찬가지입니다. –

+0

조사 할 것입니다. 어쩌면 이상한 방법으로 건설 될 수 있습니다. 감사! –

+0

당신이 옳았어요 -이 행동에 예외 처리기가 있었는데, 내가 찾고있는 것을 알지 못한다면 그 목적에 대해 암시 할 수있는 것이 아무것도 없었습니다. 특히 코드 스 니펫에 도움을 주셔서 대단히 감사합니다! –

관련 문제