문제

VB6 밖에서 시작된 프로세스를 원격으로 디버깅 할 수 있습니까?

응용 프로그램은 DLL/OCX 리소스가 상당히 많은 VB6 응용 프로그램입니다. VB6 앱의 등록이없는 COM을 사용하여 ClickOnce 배포를 설정하려고하지만 실행할 때 오류가 발생했습니다.

VB6이 COM 등록을 리디렉션하는 방식에 대한 나의 이해는 이것이 불가능하다는 것을 의미 할 것이지만 누군가가 더 나은 아이디어를 가질 수 있다고 생각했습니다.

도움이 되었습니까?

해결책

VB6에서 디버깅 할 때 실행 중이진에 부착되지 않고 대신 코드를 자체 프로세스 내에서 해석한다고 생각합니다. 그렇기 때문에 작업 관리자와 Win32 API가 디버깅 할 때 vb6.exe를 실행중인 앱으로 표시하는 이유입니다.

또한 VB6은 때때로 단락이 COM 라이브러리로 전화를 걸므로 이러한 통화를 가로 채는 것이 항상 가능하지는 않습니다.

당신은 아마도 지능형 로깅에 의지해야 할 것입니다 (즉, 그것이 발생하는 코드 라인을 찾기 위해 발생하는 오류가 발생하는 지점 주위에 변수 값을 기록하고/또는 관련 변수의 상태를 찾으십시오. .))

행운을 빕니다

다른 팁

Darryl의 답변을지지합니다 Windbg - 여기에 있습니다 2006 블로그 게시물 VB6과 함께 Windbg를 사용하는 것에 대한 Microsoft 남자에 의해 2004 블로그 게시물 Windbg에 대한 간단한 소개를 가진 다른 Microsoft Guy.

편집 : 완전히 명확하게하기 위해. WINDBG는 Microsoft의 무료 독립형 디버거입니다. VB6 EXE, DLL 및 OCXS를 기호 (PDB 파일 생성)와 함께 기본 코드로 컴파일하면 ClickOnce 응용 프로그램을 디버깅 할 수 있습니다.

블로그에서 발췌 한 주요 :

서버 시스템에 대한 액세스가 제한되어 있으면 WindBG의 원격 디버깅 시설을 사용할 수 있습니다. WINDBG 사본을 일반적인 방식으로 프로세스에 첨부 한 다음 디버깅 서버로 옮깁니다 (WINDBG 도움말에서 .server를 확인하십시오). 그런 다음 WindBG의 파일 메뉴에서 원격으로 연결할 수 있습니다. 서버 룸 팬의 소음이 부족한 것을 제외하고는 그곳에있는 것과 같습니다. 리모컨을 디버깅 할 때 WindBG 사본은 매우 스마트 한 터미널이므로 모든 확장, 기호 등이 원격 서버에 있어야합니다. 모든 DLL, VB6 또는 .NET에 대해 동일한 방식으로 설정했습니다.

구성 요소의 기호는 구성 요소가 진행될 때까지로드되지 않으므로 서버가 최소한 오래 실행하도록해야합니다. 해당 시점에서 디버거를 중지하려면 VB 코드 초반에 휴식을 취할 수 있지만 그렇게한다면 코드를 통해 매번 중지 할 것임을 기억하십시오. "X MyModule!*"로 모듈에로드 된 기호를 나열하면 모든 기능을 여러분을 위해 번들로 제공하는 많은 기호와 함께 모든 기능을 볼 수 있습니다. VB는 인터페이스와 기호를 부끄럽게 추가하지만 일반적으로 걱정할 필요는 없습니다. 아마도 이상하게 보일 것입니다. WINDBG는 VB가 다르다는 것을 이해하지 못하고 기호가있는 DLL처럼 취급됩니다.

여기에서 중단 점을 일반적인 방식 (BP 등)으로 설정하고 코드를 진행할 수 있습니다. VB 파일 확장자가 소스 파일 유형 드롭 다운에 있지 않지만 VB 소스 코드 모듈을 열고 F9로 브레이크 포인트를 설정할 수도 있습니다. 코드를 밟는 것이 드러나지 만 VB가 이전에 생성 한 코드를 보지 못했다면 약간 경고 할 수 있습니다. 당신은 어셈블러를 밟고 거기에 많은 com goo가 있습니다. hresults가 많이 확인됩니다. 소스 코드의 모습을 알기 위해 약간의 연습이 필요하기 때문에 자주 소스를 자주 참조해야 할 것입니다. VB가 당신을 위해 많은 작업을 수행하고 간단한 방정식처럼 보이는 것이 많은 코드를 초래할 수 있기 때문에 변형은 특히 어려운 일입니다. 실행 순서는 종종 예상되는 것과 매우 다르고 데이터를 보는 것이 평소보다 어렵 기 때문에 최적화 된 코드는 훨씬 어렵습니다.

데이터는 이런 식으로 쉽게 얻을 수 없습니다. 로컬 변수를 보면 (DV는 명령 임) 변수가 간단하게 EClipsed로 나열되어 있음을 알 수 있습니다. 즉, 메모리가 기능 수명 내에서 다른 것에 사용 되거나이 맥락에서 이름이 고유하지 않음을 의미합니다. . 열거는 단지 정수 나 길이와 물체가 포인터로 표시되는 것으로 표시됩니다. 사실, 그들은 항상 정확히 그랬지만 VB IDE는 당신에게서 그것을 숨 깁니다. VB 문자열은 덮개 아래의 com bstr (및 유니 코드)이며 바이트 어레이는 실제로 숯 배열입니다. VB가 ANSI 외에는 아무것도 지원하지 않는 것처럼 보이기 때문에 VB 문자열이 유니 코드라는 사실에 놀랄 수도 있습니다. Ruby Forms 엔진은 ANSI 전용이기 때문입니다. 런타임은 유니 코드 문자열을 Ruby 및 API 호출의 ANSI로 변환하지만 원하는 경우 유니 코드를 통과 할 수있는 방법이 있습니다.

ERR, APP 또는 프린터 객체를 얻을 수 없을 것입니다. 왜냐하면 많은 내부적이고 완전히 문서화되지 않은 구조물을 통과해야하므로 그들에게 얻을 수 있습니다. 당신이 그곳에 도착할 수 있더라도 VB에서 사용하는 액세서 기능이없는 원시 데이터 일뿐입니다. 해당 필드를 살펴 봐야하는 경우 소스 코드에 디버그 코드를 포함하여 값을 얻을 수있는 곳에 복사하는 것이 가장 좋습니다.

원하는 경우 VB 런타임으로 들어갈 수 있지만 응용 프로그램을 디버깅하려는 경우에는 드러나지 않을 것입니다. 그렇게한다면 VB의 내부가 크게 영향을 받는다는 것을 알 수 있습니다. 일부 COM 아이디어가 원래 VB에서 나온 이후로 영향은 실제로 두 가지 방법이었습니다.

코드를 실행할 때 예외가 표시 될 수 있습니다. NULL 참조 예외 (예 : NULL 포인터를 Dereferencing)는 드문 일이 아니거나 걱정할 것이 아닙니다. 그들은 0 또는 거의 0 주소로 첫 번째 기회 C000005 예외로 나타납니다. 객체가없는 경우 런타임은 때때로 가능한 값이 널 또는 유효한 값이기 때문에 안전합니다. 코드가 컬렉션에서 조회하고 값이 없으면 예외가 표시됩니다. 예외는 이제 너무 비싸기 때문에 가능하다면 그렇게하지 않기를 원할 것입니다. 일반적으로 볼 수있는 또 다른 예외는 C000008F입니다. 숫자를 찾으면 부동 소수점 결과 예외임을 알 수 있습니다. 여기서는 다른 의미로 사용됩니다 - 우리는 실제 부동 소수점이 부정확 한 결과 예외를 생성하지 않기 때문에 정상적인 랩핑 가능한 유형의 VB 오류를 나타내도록 안전하게 던질 수 있습니다.

VB 구성 요소의 디버깅 및 충돌은 관리되지 않은 다른 구성 요소와 같은 방식으로 매우 수행되지만 위에서 설명한 컴파일로 인해 조금 더 어렵습니다. VB 코드를 이런 식으로 디버깅해야한다면 "Hello World"응용 프로그램에서 시작하여 작업을 수행하는 것이 좋습니다. Code가 쉬운 언어로 VB를 VB로 만들 수있는 모든 것은 디버깅하는 끔찍한 언어로 만듭니다.

당신은 시도 했습니까? Windbg? 프로젝트에 대한 PDB 파일이 있는지 확인하십시오.

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