2009-12-16 5 views
2

프로그램이 막 시작된 ​​것처럼 malloc을 초기 상태로 되돌릴 방법이 있는지 알고 계십니까?malloc()을 초기 상태로 되 돌린다

이유 : nintendods devkitpro를 사용하여 임베디드 응용 프로그램을 개발 중이며 소프트웨어 장애 발생시 디버깅 지원 기능을 향상시킬 수 있기를 바랍니다. 이미 대부분의 오류를 잡을 수 있습니다. 콘솔 메뉴로 돌아가지만 std :: bad_alloc을 잡을 때 제대로 작동하지 않습니다.

내가 "소프트 재부팅"을 위해 사용하는 코드는 malloc() 자체가 제어 할 수 없다고 생각합니다. 따라서 "실행중인 앱에 대해 모든 것을 잊어 버리고 새로운 시작을 얻으십시오".

+0

btw, 내가 사용하고있는 malloc 구현은 malloc_stats와 mallinfo를 가지고 있지만 malloc_set_state 나 malloc_get_state는 아니며 솔루션을 제공했을 수도 있습니다. – PypeBros

+0

는 내 devkit이 "newlib"의 mallocator를 사용하고있는 것처럼 보입니다. 나는이 문제를 조사 할 수있는 더 좋은 방법을 찾아 내기 위해 이것을 연구 할 것이다. – PypeBros

답변

1

새로운 시작을 얻는 유일한 방법은 저장소에서 응용 프로그램을 다시로드하는 것입니다. DS는 모든 것을 RAM에로드합니다. 즉, 데이터 섹션이 제자리에서 수정됩니다.

+0

... 차례로 기억 장치에서 RAM에있는 앱을 로딩하면 결코 malloc()을 사용해서는 안된다는 사실을 강조합니다 ... – PypeBros

3

C++의 임베디드 구현은 그것을 확장으로 제공 할 수도 있지만이 방법을 이식 할 방법이 없습니다. 대신 자신의 할당 시스템을 작성하거나 메모리 풀을 사용하거나 기존 라이브러리를 사용해야합니다.

2

내가 비슷한 것을했을 때만, 할당 된 각 블록에 대한 참조를 유지할 우리 자신의 할당자를 사용했습니다. 롤백을 원하면 할당 된 블록을 모두 비우고 longjmp를 실행하여 프로그램을 다시 시작합니다.

1

나는 다른 것이 없다면 API가 Nintendo에서 제공하는 전체 메모리 블록을 0으로 쓸 수 있다고 생각합니까? 하지만 그렇지 않으면 할당량을 추적하십시오.

실제로 할당 된 각 메모리 블록에 대한 참조를 유지하기 위해 CatchAndRelease 클래스를 생성하면 필요한 시간에 되돌아 가서 그 값을 지울 수 있습니다.

그렇지 않으면 Neil이 언급 한 것처럼 자체 메모리 풀을 작성해야 할 수 있습니다.

0

std :: bad_alloc은 새로운 오류가 발생하여 요청 된 메모리를 할당 할 수 없을 때 발생합니다. 일반적으로 힙에 메모리가 부족하여 요청을 받아 들일 수 없을 때 발생합니다. 이러한 이유로 정리에서 새 메모리를 안정적으로 할당 할 수 없습니다.

즉, 정리를 위해 새 메모리를 할당하지 않을 수도 있습니다. 성공적으로 정리하는 유일한 희망은 정리 코드의 메모리가 실제로 필요하기 전에 미리 할당되도록하는 것입니다.

객체는 여전히 인플레 이스 new 연산자를 사용하여이 정리 메모리에 newed 할 수 있습니다 (즉, 당신이 메모리 주소를 제공 할 경우 신규) 예를 들어, 글로벌 위치에 메모리

2

다람쥐 멀리 조금 당신이 std::bad_alloc을 얻을 때

int* not_used = new i[1024]; 

그런 다음 NOT_USED 삭제하고 오류 콘솔로 이동합니다. 아이디어는 충돌 처리기에 필요한 공간을 확보 할 수있는 충분한 공간을 제공하는 것입니다. 콘솔에 메모리 오류가 발생하지 않도록 메모리 양을 조정해야합니다.

당신이 현명하다면 not_used를 실제로 사용할 수 있습니다. 그러나 메모리를 사용하는 모든 것이 사전 통고없이 삭제 될 수 있다는 점에주의해야합니다.

+0

좋은 생각. 얼마나 많은 메모리가 필요한지 무시하기 때문에 약간의 조정이 필요합니다. 그러나 알아낼 수 있다면 트릭을 수행 할 수 있습니다. 메모리의 부족 *이 문제의 뿌리라고 나는 확신하지 못합니다. 버퍼 오버플로가 malloc의 내부 상태를 망칠 수도 있습니다. – PypeBros

1

선입 선출 (last-in-first-out) 주문 이외의 다른 방법으로 메모리를 비워야합니까?그렇지 않다면, 사용 가능한 모든 메모리를 사용하도록 배열을 정의한 다음 (이렇게하려면 링커 파일을 조정해야 할 것입니다) 배열의 시작 부분에 대한 포인터를 초기화하는 것이 좋습니다. 그런 다음 자신의 malloc() 함수를 쓰기 :이 구현에서

 
char *allocation_ptr = big_array; 

void *malloc(size_t n) 
{ 
    void *temp = (void*)allocation_ptr; 
    if (allocation_ptr > END_OF_ALLOCATION_AREA - n) 
    return 0; 
    allocation_ptr += n; 
    return temp; 
} 

void free_all_after(void *ptr) 
{ 
    if (ptr) 
    allocation_ptr = (char*)ptr; 
} 

을 free_all_after는()를 후 할당 된 표시된 포인터 모든 것을 사용할 수있게됩니다. malloc()의 다른 구현과는 달리, 여기에는 의 제로의 오버 헤드가 있습니다. LIFO 할당은 매우 제한적이지만, 많은 임베디드 시스템에서는 전체적으로 충분할 것입니다.

+0

예, 불행히도 그 시점까지 메모리 할당을 단순화 할 수 없습니다. – PypeBros

+1

@sylvainulg : 메모리 관리 방식은 일부 작업에는 적합하지만 전부는 아닙니다. 약간의 차이점은 상단과 하단 모두에서 할당되는 메모리 블록을 갖는 것입니다 (이 경우 상단과 하단에서 LIFO 릴리즈를 독립적으로 수행 할 수 있습니다). 메모리에 대한 모든 포인터를 쉽게 찾을 수 있다면 (1980 년 시대의 마이크로 컴퓨터 기본 인터프리터에서 사용되는) 세 번째 변형은 빈 포인터 대신 쓰레기 압축을 사용하는 것입니다 (이중 간접 포인터를 사용하면 도움이 될 수 있음). 이 접근 방식에는 한계가 있지만 조각화는 없습니다. – supercat

관련 문제