2010-08-19 3 views
1

오류를 기록 할 때 일반적으로 스택 추적을 포함합니다. 이것은 좋은 일이지만 오류가 실제로 어디에 있는지 알기가 어렵습니다.더 완벽한 오류 로그

오류가 발생했을 때 매개 변수, 로컬 변수 등을 반사를 통해 수집하는 루틴을 설정할 수 있습니까?

+0

"오류가 발생한 위치를 알 수 없음"의 예를 들려 줄 수 있습니까? 귀하의 문제가 나쁜 예외 처리 (호출 스택 추적을 파괴), 또는 그것은 단지 당신이 스택 추적을 읽는 데 도움이 필요한지 궁금하네요. –

+0

스택 추적은 불행히도 지역/매개 변수의 값을 표시하지 않습니다. afaik 당신은 디버거 (예 : VS)에 침입하여 런타임 로깅을 통해이 작업을 수행 할 수 없습니다. 그러나 그것은 예외가 발생한 곳 (적어도 외부 예외)을 정확히 알려 주어야합니다. –

+0

잘못된 예외 처리는 내가 생각하고 있던 것입니다. 나는'try {...} catch (Exception ex) {Log.Error (ex);}와 같은 예외 처리를 매우 자주 보았습니다. 전을 던져라. }'또는 심지어 그냥'try {...} catch (Exception ex) {throw ex; }', 둘 다'throw ex;'가 실행될 때 예외에서 스택 추적을 버린다. 예외를 다시 던져야 할 필요가 있다면, 일반적으로'try {...} catch (Exception ex) {'Log.Error (ex); 던지다; } '또는 내부 예외로 원래 예외가있는 새 예외를 throw 할 수 있습니다. –

답변

2

VS2010이없는 경우 PostSharp를 사용하여 코드를 직조하여 함수가 호출 될 때 매개 변수를 수집 할 수 있습니다. 그래도 코드 속도가 느려지므로 디버깅에만 유용합니다.

편집 : 그것은 단지 특정 클래스/네임 스페이스에서 작동, 그래서 당신이 생산이를 사용하려면

, 당신은 PostSharp 직물의 범위를 제한 할 수 있습니다 (나는 방금 만든 코멘트에서이 홍보)/어셈블리 (또는 함수)를 사용하거나 조언을 실행할 때 수행 할 작업을 제한 할 수 있습니다. 한 가지 시도했지만 완전히 완료되지 않은 방법은 조언 방법이 스택 프레임 정보를 링 버퍼에 기록하도록하는 것이 었습니다. 예외가 발생하면 로거가 링 버퍼에서 스택 프레임 정보를 가져 와서 적절한 로그 메시지를 생성 할 수 있습니다. 그렇지 않으면 링 버퍼가 채워지면서 프레임 정보가 덮어 씁니다. 링 버퍼 대신 스택을 사용하고 호출 스택이 커지고 축소 될 때 해당 스택이 커지고 축소되어 프레임 정보를 기록 할 수도 있습니다. 주의 사항 : PostSharp에서 수정할 수없는 프레임 워크 코드 또는 타사 코드에서 프레임 정보를 가져올 수 없습니다.

+0

PostSharp는 디버그 목적으로 추적 로깅을 사용하는 좋은 방법이지만 조심스럽게 사용하지 않으면 _lot_ 노이즈가 발생할 수 있습니다. 프로덕션 환경에서 매일 100MB의 로그 파일을 생성하는 앱을 보았습니다. 디스크 공간을 확보하고 성능 저하를 허용하고 로그를 구문 분석/필터링하여 로그를 이해할 수있는 적절한 도구를 사용할 수있는 한 중요한 데이터입니다. –

1

VS2010으로 업그레이드 할 수있는 경우 정확히이 작업을 수행하는 IntelliTrace 기능을 사용해 볼 수 있습니다.

+1

Ultimate 에디션 라이센스를 구매하려면 두 번째 담보 대출을 받아야 할 수도 있습니다. :) –

+0

일단 앱을 개발 단계가 아닌 프로덕션에 배포하면됩니다. – AngryHacker

+0

우선, 프로덕션 환경에서 이러한 문제가 발생하지 않아야합니다. 더 나은 테스트를 수행하고 먼저 테스트를 받으십시오. 둘째, 확실하지 않지만이 중 일부는 프로덕션에서 사용할 수 있습니다. 데이터 수집기가 실제로 Visual Studio에서 실행되어야 할 필요가 있다면 놀랄 것입니다. –