2011-03-15 3 views
0

.NET Framework 4에서 실행되는 응용 프로그램이 있고 응용 프로그램이 관리되고 비 관리 코드로 실행됩니다. UDP 소켓은 사용자 정의 하드웨어와 통신하기 위해 사용자 정의 통신 스택과 함께 사용됩니다. Visual Studio에서 응용 프로그램을 실행하면 모두 정상적으로 작동하지만 자체적으로 실행하면 종종 멈 춥니 다. Windows XP SP3 및 Windows 7 SP1에서이 동작을 보았습니다. 앱이 멈 추면 대부분의 스레드에서 ntdll.dll에 멈추었 음을 알 수 있습니다. 나는 또 다른 질문 스레드에서 이것이 정상적인 교착 상태가 여전히 내 코드로 인해 발생했다고 들었다.Visual Studio에서 호스팅되는 디버그 응용 프로그램을 실행하고 직접 실행하는 것의 차이점은 무엇입니까?

이 앱에 첨부 할 수 있고 기본 모드에서 일시 중지 할 수 있기 때문에 디버그하기가 매우 어렵습니다. 따라서 디스 어셈블리 만 보입니다. 나는 저를 도울 수있는 힌트를 찾고 있습니다. 그렇다면 F5를 사용하여 Visual Studio에서 실행할 때와 직접 실행할 때 응용 프로그램이 멈출 수있는 원인이 누구에게 있습니까? 관리 코드에서 GC가 다르게 작동한다는 점을 읽었습니다. 차이점은 무엇입니까? 또한 관리되지 않는 코드의 경우 해당 메모리가 다르게 초기화되었습니다. 다시 차이점은 무엇입니까?

도움을 주시면 대단히 감사하겠습니다.

Seb

+0

ntdll.dll에 대한 기호를 다운로드 할 수 있습니까? 이것은 적어도 디버거를 부착 할 때 앱이 멈추는 기능을 알려줄 것입니다. 충분한 심볼을로드하면 호출 스택이 의미있는 것으로 보이기 시작합니다. 아마도 이것은 당신의 문제를 밝힐 수 있습니다. –

+0

그냥 "앱을 스스로 실행"할 때 디버그 빌드 또는 릴리스 빌드를 실행하고 있습니까? – Arnout

+0

디버그 빌드입니다. – Ssebu

답변

1

디버거없이 릴리스 빌드를 실행할 때 다른 점은 JIT 최적화가 사용 가능하다는 것입니다. 코드가 더 빨리 실행됩니다. 문제와 강한 상관 관계가있는 스레딩 문제는 타이밍에 민감합니다. 자신의 코드가 여전히 개발 머신에서 실행되는 동안 이것이 잘못되었다고 스스로 운 좋게 생각해보십시오. 정말 불쾌한 쓰레딩 문제는 고객의 머신에서 일주일에 한 번 프로그램을 엉망으로 만듭니다.

이 문제를 디버깅 가능하게 만드는 것은 여전히 ​​문제를 해결하는 가장 중요한 방법입니다. Tools + Attach to Process 외에도 디버거를 시작하는 또 다른 방법은 코드에서 System.Diagnostics.Debugger.Launch()를 사용하는 것입니다. 디버거를 선택할 수있는 대화 상자가 나타납니다.

디버거를 부착 할 필요가없는 또 다른 방법은 VS를 릴리스 빌드로 전환하는 것입니다. 도구 + 옵션, 디버깅, 일반 및 "모듈로드시 JIT 최적화 억제"를 사용하십시오. 이제 F5를 누르면 옵티 마이저가 활성화되고 디버거가 사전 연결되어있는 상태에서 프로그램이 실행됩니다. 디버거가 자체적으로 부착되어있어 타이밍 차이가 발생하기 때문에 여전히 슬램 덩크는 아닙니다.

어려운 동시성 버그를 해결하기위한 또 다른 일반적인 방법은 코드에 로깅을 추가하는 것입니다. 잠금을 획득 할 때마다 라인을 작성하십시오. 운이 좋으면 교착 상태를 빨리 발견 할 수 있습니다. 운이 좋지 않은 경우 로깅은 교착 상태가 사라지도록 스레드 타이밍을 변경합니다. 로깅 기능이 활성화 된 상태로 유지되는 유일한 방법 이었기 때문에 로깅 기능이 활성화 된 상태로 제공되는 많은 프로그램이있었습니다.

코드 검토는 특히 다른 사람이 수행 할 때 다른 접근 방법입니다. 그리고 마지막으로, 스레딩이 실제로 앱에서 최적의 솔루션인지 여부를 고려하십시오. 잔소리하는 것 "나는 정말로 그것을 해결 했습니까?" 기분이 풀리지 않는 것은 스레드 코드에 결함이 없음을 증명하는 것은 거의 불가능합니다.

0

이러한 문제의 원인은 교착 상태 또는 경쟁 조건 일 수 있습니다. 중단 점과 실행 중단으로 인해 특정 코드 경로의 실행 기간이 변경되므로 응용 프로그램을 디버깅 할 때 사라집니다.
네이티브 모드로만 연결할 수있는 이유는 무엇입니까? 원격 디버깅조차도 관리 응용 프로그램에서 지원됩니다.

+0

관리 코드와 관리되지 않는 코드가 혼합되어 있습니다. 네이티브 모드로만 연결할 수 있다는 사실은 C++ 코드에서 고정이 발생했음을 나타냅니다. – Ssebu

+0

@Ssebu : 아니, 그게 이유가 아니야. 아마, 응용 프로그램이 이미 실행 중이며 디버그 -> 첨부를 사용하여 처리하고 있다고 가정합니다. "Attach to"텍스트 상자에서 읽는 내용은 무엇입니까? 그리고 응용 프로그램의 "Type"열의 값은 무엇입니까? –

+0

열 유형에 T-SQL, Managed (v4.0.30319), x86이 나와 있습니다. 연결을 시도한 다음 일시 중지 단추를 누르면 다음 오류 메시지가 나타납니다. "실행을 중단 할 수 없습니다.이 프로세스는 현재 디버깅하도록 선택한 코드 유형을 실행하지 않습니다." – Ssebu

관련 문제