2014-07-10 5 views
0

24/7 서버에서 실행되도록 설계된 응용 프로그램이 있습니다. Localy는 모든 것이 원활하고 예상대로 작동하는지 테스트했습니다. Windows Server 2012 R2에 배포 - 주 작업 (스레드)이 시작될 때마다 예외가 발생합니다.C# "주 스레드"에 예외 캐치

서버에는 분명히 Visual Studio가 없으므로 ig를 디버그 할 수 없습니다. 나는 "{ApplicationName}이 (가) 작동을 멈췄다."라고 말하는 추악한 Windows 대화 상자를 보았습니다.

EventViewer에서 오류의 위치를 ​​나타내는 항목을 발견했습니다.

이벤트 로그는 말한다 :

Application: MyApplicationBackend.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.IO.FileNotFoundException 
Stack: 
    at Application.Name.SomeClass..ctor() 
    at Application.Name.SomeThread() 
    at System.Threading.ThreadHelper.ThreadStart_Context(System.Object) 
    at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 
    at System.Threading.ThreadHelper.ThreadStart() 

음, SomeClass의 생성자 내부에가는 중요한 아무것도 없다 -이 같은 단지 MySQL 데이터베이스 연결을, (어디 CFG 싱글 들고 구성이다. 값) :

//Connecto to server. 
String connectionString = "server=" + cfg.DatabaseServer + ";user=" + cfg.DatabaseUser + ";database=" + cfg.DatabaseName + ";port=" + cfg.DatabasePort + ";password=" + cfg.DatabasePassword + ";"; 
mysqlConnection = new MySqlConnection(connectionString); 
  • MySQL의 커넥터 닷넷 6.8.3이 설치되어
  • 코드가 원격 데이터베이스 (로컬 네트워크)에 연결될 것입니다.
  • 코드는 로컬 컴퓨터에서 완벽하게 작동합니다.

    1) 나는 (그리고 경우, 방법) 주 스레드에서 중첩 된 스레드의 모든 수준에서 표시 예외를 처리 할 수 ​​있습니다? (동일 네트워크)

이이 개 질문을 제기?

2.) 어떤 종류의 파일이 발견 될 수 있습니까? (이 2 줄의 코드와 관련하여)? 및 localY의 작업 미세 (soure는 네트워크 공유에있는),하지만 내 서버에서 실행할 때 나는


그냥 물건을 디버깅 일부으로 메시지를 사용 (동일한 네트워크 공유에서 같은 exectuable 사용)이 예외를 얻을 그것은 나타나서처럼 ... 그리고 예외가 발생합니다 -

public class class1{ 
    private void SomeThread(){ 
     MessageBox.Show("before con"); 
     DbCon dc = new DbCon(); 
     MessageBox.Show("after con"); 
    } 
} 

내가 "사기 전에"메시지를받을

public class DbCon{ 
     public DbCon(){ 
      MessageBox.Show("inside"); 
      String connectionString = "server=" + cfg.DatabaseServer + ";user=" + cfg.DatabaseUser + ";database=" + cfg.DatabaseName + ";port=" + cfg.DatabasePort + ";password=" + cfg.DatabasePassword + ";"; 
      mysqlConnection = new MySqlConnection(connectionString); 
     } 
    } 

을 ... 궁극적으로는 다음과 같습니다 t는 DbCon -Class를 찾지 못하지만 실행 파일의 일부이므로 File-Not-Found-Exception을 실행할 수 없습니다. ?? !! (그리고 로컬 컴퓨터에서 작동합니다 :-() ...

+0

아마도'cfg'가 파일에서 구성을 읽으려고 시도하고 그 파일이 서버에 없습니까? – Medo42

+0

@ Medo42, 작동이 확인되었습니다. (예, 싱글 톤은 파일에서 읽는 중입니다. 그러나 앱 시작시 읽었을 때만 앱 닫기로 다시 쓰기 만합니다.) – dognose

+0

다음으로 'MySqlConnection' 클래스를 찾을 수 없습니까? 실행은 실제 생성자 코드에 도달하는 것처럼 보이지 않지만 생성자에 대한 호출까지 모든 것이므로 참조 된 클래스를로드하지 못할 수도 있습니다. 그런 다음 mysqlconnection이 유형이 'MySqlConnection' 인 경우 다시 Cctor에서 이미 실패했을 것입니다. – Medo42

답변

1

1) 그렇습니다. 사용법은 매우 까다 롭지 만 언제든지 FirstChanceException Event에 연결하여 예외를 잡을 수 있습니다.

AppDomain.Current.FirstChanceException += (sender, e) => { ... }; 

참고이 또한 후드 .NET에 의해 처리 포함한 후 처리 예외에 대한 해고되고, 조금 당신이 응용 프로그램을 늦출 수 있습니다. 대개 권장하지는 않지만 어셈블리의 내부와 외부 모두에서 응용 프로그램의 관리되는 코드에 던져지는 모든 것을 잡아낼 수있어 디버깅에 절대적으로 뛰어납니다.

EDIT : 가능한 한 가볍게 첨부하려면 Main을 정적 클래스에 넣고 이벤트를 정적 생성자에 넣습니다.이렇게하면 일찍 일어나기 때문에 DLL로드를 선점 할 수 있습니다.

2) 파일에서 구성을로드한다고 가정 할 때 파일을 찾을 수없는 여러 가지 이유가 있습니다.

  • 서버에서 실행중인 경우 프로그램이 관리자 또는 파일 시스템에 액세스하는 데 필요한 권한으로 실행되고 있는지 확인하십시오. 이것은 네트워크 공유에 공통적 인 문제입니다
  • "C : \ ProgramData"또는 "% ProgramData %"와 같은 로컬 경로로 파일을 참조하지 않으려면 C 드라이브를 조사해야합니다. 실행중인 컴퓨터의
  • GAC에서 DLL을 사용하는 경우 대신 출력 폴더에 복사하십시오. 서버에로드 된 파일이 없거나 버전이 다른 경우 (일반적으로 DllNotFoundException이지만) 예외가 발생할 수 있습니다 짐을 실은.

액세스 가능한 경우 서버로 원격 작업을 시도하고 로컬에서 디버깅을 시도하십시오. 그러면 실제 전개 환경의 문제점을 알 수 있습니다. 또한 귀하의 상황에 도움이 될 수있는 debug on a remote machine 수있는 방법이 있습니다.

+0

(나는이 답변이 오래되었다는 것을 알고 있지만) * FirstChanceException 이벤트 : "사용법에 대해 매우 권고하고 있지만 *"- 누구에 의해, 왜? (현재 내가 [this] (http://stackoverflow.com/q/35503673/321013)을 조사하고 있기 때문에) –

+0

@MartinBa이 경우에는 나 자신에 대한 사용을 강력히 권고하고 있습니다. SO). 이는 디버깅에 유용 할 수 있지만 위에서 언급 한 "모든 문제가 발생합니다"문제를 가지고 있으며 핸들러 자체가 예외를 쳤을 때 설명서에 심각한 손상이 표시되기 때문입니다. 처리 된 예외를 치는 기회도 매우 높습니다. 프로덕션 코드에서 활성화 할 때, 나는 프로그램 시작시가 아니라 버그를 재현하기 전에 중단 점을 활성화하기 만합니다. – David