소스 코드 없이 앱이 무작위로 충돌하는 경우 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/439489

  •  22-07-2019
  •  | 
  •  

문제

문제가 있는 고객을 도우려고 하는데 아이디어가 부족합니다.그들은 일정에 따라 실행되는 사내 애플리케이션을 작성했지만 충돌이 발생했습니다.이렇게 된 지 얼마나 되었는지 모르기 때문에 특정 소프트웨어 업데이트로 인한 충돌을 추적할 수 없을 것 같습니다.가장 불행한 부분은 논리의 핵심을 포함하는 VB6 DLL의 소스 코드가 더 이상 없다는 것입니다.

이 VB6 DLL은 VB 스크립트의 2-3 함수 호출로 시작됩니다.분명히 VB 스크립트를 수정하여 오류 로깅을 추가할 수 있지만 충돌의 원인을 정확히 찾아낼 수 있는 품질 정보를 얻는 데는 어려움이 있습니다.모든 함수 호출의 양쪽에 로깅 메시지를 넣었고 어느 ​​호출이 충돌을 일으키는지 확인했습니다.그러나 호출이 wscript.exe와 충돌하기 때문에 err 개체에는 아무 것도 반환되지 않습니다.

내가 할 수 있는 다른 일이 있는지 잘 모르겠습니다.어떤 아이디어가 있나요?

편집하다:소스 코드가 없더라도 제가 걱정하는 주된 이유는 충돌을 일으키는 외부 요인(부족한 자격 증명, 잠긴 파일 등)이 있을 수 있다는 것입니다.wscript.exe 충돌로 인해 drwtsn32.log에 생성된 로그 파일을 확인한 결과 "액세스 위반"이라는 정보만 나왔습니다.

처음에는 이것이 보안 권한과 관련된 것이라고 생각하는 경향이 있지만, 이것도 메모리 액세스 위반일 수는 없을까요?

도움이 되었습니까?

해결책

당신은 하나를 사용하는 것을 고려할 수 있습니다 sysinternals 도구 이것이 파일 권한과 같은 환경에 문제가 있다고 생각하는 경우 도구. 나는 한 번 Filemon을 사용하여 내 응용 프로그램이 터치하고있는 모든 파일을 파악하고 그런 식으로 문제를 발견했습니다.

당신은 또한 빠른 정신 점검을 원할 수도 있습니다. 의존성 워커 당신이 생각하는 DLL 파일을 실제로로드하고 있는지 확인하십시오. C 런타임의 잘못된 버전이로드되어 신비한 충돌을 일으켰습니다.

다른 팁

응용 프로그램의 범위에 따라 클라이언트가 다시 쓰기를 고려할 수 있습니다. 소스 코드가 없으면 결국 다른 것이 변할 때 어쨌든 그렇게해야합니다.

충돌 앱을 실행하는 PC 또는 메모리 덤프에서 직접 디버거를 사용하여 항상 발생하는 일이 더 적거나 그 이하로 결정할 수 있습니다. 이 경우 코드가 VB6 인 경우 Win32 레벨에서 유용한 정보 만 얻을 수 있기 때문에 그다지 도움이되지 않을 수 있습니다.

궁극적으로 소스 코드가 없다면 버그가 실제로 도움이되는 위치를 찾을 수 있습니까? 호출 스크립트에서 해당 코드 경로를 피할 수 없다면 어쨌든 해결할 수 없습니다.

당신은 사용할 수 있습니다 Windows 용 디버깅 도구. 오류를 정확히 파악하는 데 도움이 될 수 있지만 소스를 고칠 소스가 없으면별로 좋지 않습니다.

더 게으른 방법은 코드에서 DLL을 호출하여 (스크립트가 아님) 최소한 문제를 일으키는 원인을보고 ERR 객체를 검사하는 것입니다. 문제가 잘못 호출되지 않는 한 여전히 고칠 수 없습니다.

그 사람 휠 코딩 심각한 기술 정보로 가득 찬 온라인 포커 봇을 구축하는 방법에 대한 매우 흥미로운 시리즈가 있습니다. 그 중 많은 부분은 기존 애플리케이션에 접근하여 이를 조작하는 방법, 즉 어떤 방식으로든 원하는 작업에 관한 것입니다.

구체적으로 그는 WinDbg를 사용하여 중요한 정보를 얻는 방법에 대한 기사, 하나에 자신의 코드에 대한 함수 호출을 구부리는 방법 그리고 하나는 다른 프로세스에 DLL을 주입하는 것입니다..이러한 기술은 충돌을 찾아 해결하거나 수정하는 데 도움이 될 수 있지만 여전히 어려운 작업인 것 같습니다.

도움이 될 수있는 몇 가지 도구가 있습니다. 먼저 종속성 워커를 사용하여 앱의 런타임 프로필을 수행 할 수 있습니다.

http://www.dependencywalker.com/

프로필 메뉴가 있으며 팔로우 하위 프로세스 옵션이 확인되었는지 확인하려고합니다. 이것은 두 가지 일을 할 것입니다. 먼저,이를 통해 당겨지는 모든 LIB 버전을 볼 수 있습니다. 이는 일부 문제에 도움이 될 수 있습니다. 둘째, 런타임 프로파일은 Debug Memory Manager가 자식 프로세스를 실행할 때 사용합니다. 따라서 버퍼가 오버런이 오버런과 그에 대한 약간의 정보가 있는지 확인할 수 있습니다.

또 다른 유용한 도구는 Mark Russinovich의 프로세스 모니터입니다.

http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

이 도구는 모든 파일, 레지스트리 및 스레드 작업을보고합니다. 이렇게하면 파일 또는 레지스트리 자격 증명 문제에 부딪 치는지 확인하는 데 도움이됩니다.

Process Explorer는 동일한 정보를 많이 제공합니다.

http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

이것은 또한 Russinovich 도구입니다. 이 도구를 통해 일부 데이터를 보는 것이 조금 더 쉽다는 것을 알았습니다.

마지막으로 Windows 또는 Dev Studio 용 디버깅 도구를 사용하면 오류가 발생하는 위치에 대한 통찰력을 얻을 수 있습니다.

액세스 위반은 거의 항상 메모리 오류입니다.이 경우 무작위 충돌 (권한이 더 분명히 재현 가능할 수 있음). DLL의 경우

  1. DLL 자체의 코드에는 오류가 있습니다. 이것은 메모리 할당 오류 또는 간단한 루프 경계 조건 오류와 같은 것일 수 있습니다.

  2. DLL이 시스템의 다른 DLL에 연결하려고 할 때 오류가 있습니다. 이것은 일반적으로 기계의 DLL 버전간에 불일치로 인해 발생합니다.

첫 번째 단계는 재현 가능한 충돌 조건을 얻는 것입니다. 시스템에 충돌 할 일련의 상황이 없다면 시스템을 수정 한시기를 알 수 없습니다.

그런 다음 깨끗한 기계에 시스템을 설치하고 오류를 재현하려고합니다. 모니터를 실행하고 프로그램이 충돌 할 때 다른 파일 (DLLS 등)이 열리는 내용을 정확하게 확인하십시오. 나는 하이퍼 스레드 펜티엄에서 충돌하지만 이전 기계를 테스트 베드로 복원하는 것이 그 것을 다루는 좋은 옵션이 될 수있는 코드를 보았습니다. 기계의 RAM의 양을 변경하는 것도 가치가 있습니다.

이 단계가 당신에게 단서를 줄 수 있기를 바랍니다. 바라건대 그것은 환경 문제가되기를 바랍니다. 따라서 올바른 버전의 Windows, DLL 등을 사용하여 피할 수 있습니다. 그러나 단서가 좋은 단서 없이이 시점에서 충돌이 계속 발생하는 경우 옵션이 다시 쓰거나 다시 작성하거나 시도합니다. 어셈블러 레버에서 DLL을 디버깅하거나 해부하여 문제를 더 사냥하십시오. 어셈블리 코드에 익숙하지 않은 경우이 두 가지 모두 장거리이며 무엇을 얻을 수 있는지보기가 어렵습니다. 그리고 어느 옵션 중 하나가 큰 시간 싱크 일 것입니다. 나는 과거에 '고용 코더'웹 사이트 중 하나에 광고 된 것과 같은 특히 낮은 수준의 높은 강도 문제에 직면했을 때, 나는 전문 지식을 가진 사람을 찾았습니다. 다시 할 수 있으려면 재현 가능한 오류가 필요합니다.

장기적으로 소스 코드가없는 DLL을 교체해야합니다. 기능을 분석하고 흐름도를 제공하는 조립 기술로 전문가에게 지불하는 것이 가치가있을 수 있습니다. 실행중인 기계가 충돌 한 후 Windows 버전을 더 이상 사용할 수 없을 때와 같이 나중보다 더 빨리 제어 된 방식 으로이 작업을 수행하는 것이 좋은 비즈니스 관행입니다.

사용해 보시고 싶을 수도 있습니다 리소스 해커 운이 좋을 수 있습니다. 전체 소스 코드를 제공하지는 않지만 적어도 앱이 수행하는 작업에 대한 더 많은 정보가있을 수 있으며, 이는 Culrpit을 결정하는 데 도움이 될 수 있습니다.

가능한 최대 RAM을 기계에 추가하십시오

이 단순하고 저렴한 해킹은 과거에 저에게 효과가 있습니다. 물론 YMMV.

역 엔지니어링은 힘든 일이지만 하나의 가능성입니다.
이론적으로는 컴파일 및 디버그/추적을 컴파일/추적 할 수 있습니다. 컴파일 된 VB6 응용 프로그램은 쉬운 부분입니다. 가장 간단한 경우 소스없이 수정하는 것이 어려운 부분입니다.

무료 컴파일러/디 컴파일러 :

VB 디 컴파일러

VB Debuggers

대부분의 경우 재 작성은 문제를 해결하는 더 성공적이고 빠른 방법입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top