LiteOS 런타임 충돌 해결

현상:

런타임 충돌은 인쇄된 레지스터 정보에 따라 malloc->LOS_MemAlloc() 함수로 역추적되며 스레드 스택 정보 워터라인은 오버플로될 것임을 보여줍니다. 

여러 테스트에서 스레드와 함수에서 둘 이상의 충돌이 발생했고, 스택 정보가 오버플로된 것처럼 보였고, 스택 추적이 모두 malloc 함수를 가리키는 것으로 나타났습니다.

 

프로세스:

liteos 디렉토리에는 malloc 내부 힙 노드의 일관성을 확인하고 일관성이 없는 경우 예외를 인쇄하는 osShellCmdMemCheck 기능이 있습니다.

 

여러 키 노드에서 메모리 힙 상태를 확인하기 위해 osShellCmdMemCheck를 추가했으며, 키 포인트를 인쇄한 후 osShellCmdMemCheck는 힙 예외와 어느 스레드에서 요청한 마지막 동적 메모리를 인쇄하지만 다음과 같은 이유로 인해 구체적인 원인을 찾기가 어렵습니다. 오류 스레드와 함수 스택은 매번 다를 수 있습니다.

크래시 시점을 분석하고 동적 메모리의 코드를 검토한 결과, 특정 malloc의 메모리가 범위를 벗어나 사용되어 다른 메모리 노드를 파괴한 것으로 최종 확인됐다. malloc을 호출하면 다른 곳에서 충돌이 발생합니다.

 

요약하다:

멀티스레딩을 하는 이유는 스레드가 메모리를 밟은 후 malloc이 적용된 메모리 블록과 인접 노드가 파괴되고, malloc을 호출한 다른 스레드의 기능이 먼저 죽기 때문입니다.

 

Supongo que te gusta

Origin blog.csdn.net/konga/article/details/84194399
Recomendado
Clasificación