미니 덤프에 따르면 특정 파일이 재귀 적 파생 파서에서 스택 오버플로를 일으키는 상황이 발생했습니다. 불행히도 나는이 문제를 재현하기 위해이를 수행하는 파일의 예 (클라이언트가 기밀 유지 문제를 가지고 있음)에 손을 대지 못해서 잠시 실제 문제를 진단하는 데 약간의 어려움을 겪습니다.작업자 스레드에서 스택 오버플로를 방지하거나이를 복구 할 수 있습니까?
분명히 파서가주의를 기울여야하지만 지금 당장 최우선 과제는 프로그램을 계속 실행하는 것입니다. 임시 방편으로 전체 프로그램을 중단시키지 않으려면 어떻게해야합니까?
첫 번째 선택은 오버플로가 발생하기 전에 파서를 정상적으로 중단 할 수 있도록 스택의 공간이 부족할 것으로 예상하는 방법을 찾는 것입니다. 파일을 구문 분석하지 못하면 허용되는 옵션입니다. 두 번째 방법은 오류를 잡아 로그에 기록한 다음 나머지 데이터로 계속 진행하는 것입니다.
Parallel.ForEach()
루프에서 구문 분석이 발생합니다. 그것이 도움이된다면 나는 다른 접근법을 위해 그것을 바꿀 용의가있다.
편집 : 현재 스레드의 스택 크기와 스택 포인터의 위치를 얻을 수 있다면 정말 킬러가 될 것입니다. 이것이 가능한가?
EDIT 2 : 결국 누군가의 샘플 파일을 추출하고 디버거에서 오류를 잡아낼 수있었습니다. 그것은 우리에게 속한 코드가 아닙니다. 예외는 어딘가에 HtmlAgilityPack에 있습니다. 그래서 저는 완전히 다른 압정을 찾아야 할 것 같습니다.
정확히 스택 오버 플로우를 일으키는 원인이 명확하지 않으므로 (paralellism이 재귀를 유발할 수는 없으므로) 도움이 될지 확실하지 않지만'ParallelOptions.MaxDegreeOfParallelism'을 사용하여 동시 호출의 양을 제한하려 했습니까? – Jcl
하나의 옵션은 구문 분석의 현재 "깊이"를 추적하는 것이고 너무 높으면 보석을 해제하는 것입니다. – dlev
@dlev 자세한 내용은 알고 싶습니다. .NET 문서에 나와 있듯이 스택 프레임과 호출 스택의 크기가 다양하기 때문에 적절한 최대 깊이를 선택하는 방법은 무엇입니까? –