저급 소켓 작업을 많이하는 iOS 앱이 있으며 최근에 IPv6 지원을 추가 한 후 앱을 실행할 때 가끔씩 발생하는 커널 패닉이 있음을 알게되었습니다. 전체 장치가 재부팅, 나는 (내 응용 프로그램에서 스택 프레임을 포함하지 않음) 비밀 정보가 많이있다 공황 파일을 얻을 수 있지만, 같은 몇 가지 중요한 일들이 여기에 표시 :소켓에 관련된 iOS 커널 패닉을 단계적으로 처리합니다.
panic(cpu 0 caller 0xffffff800f15fba0): assertion failed: se->se_flags & SEF_ATTACHED, file: /SourceCache/xnu/xnu-2784.30.7/bsd/kern/uipc_socket.c, line: 6228
Debugger message: panic
다행히이 모듈은 오픈 소스이며, 기본적으로 어설 인 I()가 먼저 VERIFY 확신
void
sockaddrlist_remove(struct sockaddr_list *sl, struct sockaddr_entry *se)
{
VERIFY(se->se_flags & SEF_ATTACHED);
se->se_flags &= ~SEF_ATTACHED;
VERIFY(sl->sl_cnt != 0);
sl->sl_cnt--;
TAILQ_REMOVE(&sl->sl_head, se, se_link);
}
: http://opensource.apple.com//source/xnu/xnu-2782.1.97/bsd/kern/uipc_socket.c이
오류가이 함수와 일치하는 것 같다 내가 여기에 가까운 버전의 코드를 발견 실패하고있다.
그러나 이것은 약간의 메모리가이 코드가 실행되기 전에 내 프로그램에 의해 손상되었을 가능성이 있음을 알려줍니다. 따라서 대부분의 메모리 손상과 마찬가지로 원인을 찾는 것이 매우 어렵습니다.
내 로깅에 따라 socket(), connect(), read() 및 write()를 비롯한 대략적인 네트워킹 호출 이후에 이런 현상이 발생하지만이 코드를 여기에 제공 할 수는 없습니다.
또 다른 정보는 IPv6에서만 발생합니다. IPv4에서는 모든 것이 문제없이 작동합니다. 그러나 나는 IPv6 코드를 문질렀으며 분명히 잘못된 것을 발견하지 못했습니다. 또한 사용자 공간에서 메모리 손상 문제로 인해 커널이 실패하게되는 것을 혼동합니다. 어쩌면 이런 일이 일어날 지 이해하면 문제를 추적하는 데 도움이 될 것입니다.
대부분의 사람들이 guard malloc을 시도하는 것이지만, 불행하게도 다른 문제가 생기면 불행히도 malloc을 사용할 수 없다고 가정합니다.
실행 중에 충돌이 발생했지만 디버거에서 멈추지 않고 전체 장치 (iPad)를 재부팅합니다.
누구든지이 까다로운 버그에 대한 검색 아이디어가있는 경우 알려 주시기 바랍니다.
편집 : 답변 중 하나의 의견에 따라
이, 내가 관련 소켓 API 호출에 대한 모든 길이를 확인했고 사람들은 올바른 것 같다. 그래서 여기에 다른 문제가있는 것처럼 보입니다. 아마도 메모리를 덮어 씁니다.
"Malloc Guard Edges"를 사용해 볼 수 있었지만 문제가 발생하지 않았습니다. "Guard Malloc"은 시뮬레이터에서 작동하기 때문에 사용할 수 없으며 하드웨어와 상호 작용하는 방식 때문에 시뮬레이터에서 제대로 실행되지 않습니다.
다른 사람이 있다면 아이디어를 알려주세요.
Apple에 로그인하고 'TSI'중 하나를 사용하십시오. https://developer.apple.com/support/technical/ –
제안 해 주셔서 감사합니다. 나는 그것을 시도 할지도 모르지만, 그것들이 제한되어 있기 때문에 (또는 더 많은 것을 얻기 위해 돈이 드는), 나는 다른 모든 아이디어를 먼저 다 써 버리고 싶다. – Locksleyu
사용자 모드에서 패닉이 발생할 수있는 경우 커널 버그입니다. 그것을보고하십시오. –