본문 바로가기

운동하는 개발자/Windows

DLL Error "Expression: __acrt_first_block == header"

728x90

나의 상황은 DLL 프로젝트와 DLL을 명시적으로 링크하고 함수를 호출하는 간단한 MFC 기반 exe로 구성되어 있었다.

어느 순간부터인가 DLL의 함수를 호출하면 해당 함수가 종료 시 exception이 발생하여
"Expression: __acrt_first_block == header"이란 에러를 발생했다.

구글에 찾아보니 원인이 여러 개가 있는 듯했다.

"주원인은 힙 메모리를 공용으로 사용하는 과정에서 메모리 해제 시 발생하는 문제"

이며 해결 상황은 여러 가지가 있었다.

1. DLL과 EXE의 MFC설정이 다른 경우 맞춰주기

DLL과 힙메모리를 같이 쓰는지 설정하는 값으로 맨뒤에 소문자 d는 디버그 모드이며
MT의 경우에는 MFC Static Library를 사용하는 것이고 
MD의 경우에는 MFC Shared DLL을 사용하는 것이라고 보면 편하다.

위의 Runtime Library를 동일하게 맞춰주고 해결되었다고 한다.

 

2. 모두 MD로 변경시키고 런타임 라이브러리(MFC 포함)를 동적링크해서 쓰기

Runtime Library를 MD로 변경 후 (MFC를 사용한다면) Shard DLL로 설정해 준다

 

3. 메모리 주소 맞춰주기

이것이 나의 케이스였다... 
아주 아주 간단한데 DLL에서 다음과 같이 함수를 선언해 내보냈다

extern "C" __declspec(dllexport) void Init(std::string param);​

그리고 호출 부분에선 

Init InitFun = reinterpret_cast<Init>(GetProcAddress(hModule, "Init"));
std::string param("abcd");
InitFun(param);

이렇게 호출하였고 에러는 Init함수가 종료되며 동시에 발생하였는데 
String을 클래스가 아니라 참조로 전달하니 문제는 해결되었다...

extern "C" __declspec(dllexport) void Init(std::string param);

→ extern "C" __declspec(dllexport) void Init(std::string& param); //정상작동

여기부터는 주원인과 내용에 따라 추측한 것으로 std::string은 클래스이기에 파라미터로 넘기면 복사생성자가 호출되어 새로운 클래스를 만들어서 힙에 저장한다.
그리고 함수가 호출 종료될 때 이 param을 제거시키는데 exe에서 전달했던 abcd의 주소와 다르므로 엉뚱한 곳을 정리하려 하다가 에러가 발생하는 것으로 추측한다 
따라서 참조자를 통해서 주소를 정확히 전달하면 해당 에러는 해결된다
(틀린 내용이면 답글부탁드립니다..)

 



참고사이트

https://velog.io/@wowb/Debug-Assertion-Failed-acrtfirstblock-header
https://stackoverflow.com/questions/35310117/debug-assertion-failed-expression-acrt-first-block-header

 

Debug Assertion Failed! acrt_first_block == header

"Debug Assertion Failed! Expression: \_\_acrt_first_block == header"런타임 라이브러리 - 위키백과, 우리 모두의 백과사전DLL이란?가상 주소 공간 - 위키백과, 우리 모두의 백과사전VC++ 빌드 옵션으로 MT, MD

velog.io

 

Debug Assertion Failed! Expression: __acrt_first_block == header

I am trying to test the dll which I wrote with GoogleTest and when I call one of the tests It throws me this error: I have come to the conclusion that the problem is in assigning memory to vectors...

stackoverflow.com

 

728x90