프로그래밍2020. 5. 31. 20:07

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

 

위 에러 메시지로 인터넷을 검색하면 dll과 dll을 사용하는 프로젝트간의 함수 호출 규칙(cdecl, stdcall)이 달라서 발생하고 동일하게 맞춰주면 해결된다고만 나오지만 근본적으로는 함수 호출할때와 호출 끝났을때의 콜 스택이 달라졌을때 발생한다.

 

호출 규칙이 같아도 해당 에러메시지가 발생하는 경우는 아래와 같이 라이브러리와 라이브러리를 사용하는 프로젝트의 헤더가 달라서 가상함수 테이블이 다르고 전달인자가 다른 함수를 호출하게 되는 경우가 있다.

 

* 라이브러리 프로젝트 TestLibClass.h

#pragma once
class TestLibClass
{
public:
	TestLibClass();
	virtual ~TestLibClass();
	virtual void aaa();
#ifdef BBB
	virtual void bbb();
#endif
	virtual void ccc();
	virtual void ddd(int a);
};

* 라이브러리 프로젝트 TestLibClass.cpp

#include "pch.h"
#include <iostream>
#include "TestLibClass.h"

TestLibClass::TestLibClass()
{
}

TestLibClass::~TestLibClass()
{
}

void TestLibClass::aaa()
{
	std::cout << "AAA" << std::endl;
}

#ifdef BBB
void TestLibClass::bbb()
{
	std::cout << "BBB : " << std::endl;
}
#endif

void TestLibClass::ccc()
{
	std::cout << "CCC" << std::endl;
}

void TestLibClass::ddd(int a)
{
	std::cout << "DDD" << a << std::endl;
}

 

* 라이브러리를 사용하는 프로젝트의 main.cpp

#define BBB
#include "../TestLib/TestLibClass.h"

int main(void)
{
	TestLibClass* pTest = new TestLibClass();
	pTest->ccc();
	delete pTest;
	return 0;
}

 

라이브러리에는 BBB 가 정의되거나 전처리기에 추가되지 않아서 bbb()가 제거된 상태로 빌드되고

라이브러리를 사용하는 프로젝트에서는 BBB를 정의한 다음 해더를 포함했기 때문에 bbb()가 있는걸로 인식되어 ccc()를 호출하면 ddd(int a)가 호출된다.

 

pTest->ccc(); 에 중단점을 걸고 가상함수 테이블을 보면 아래와 같이 bbb()는 없고 끝에 널포인터가 하나 더 있다.

해당 라인에서 디스어셈블리로 이동을 해서 esi 와 esp의 값을 보면 아래와 같은데

함수 호출 후에는 아래와 같이 값이 변하고

__RTC_CheckEsp (0E012EEh) 에서 esi, esp값을 체크할 때 실패해서 Run-Time Check Failure #0 에러가 뜨게 된다.

 

ps. ddd(int a)를 ddd()로 수정해서 전달인자가 같은 경우에는 __RTC_CheckEsp를 문제없이 통과하지만 ccc()가 아닌ddd()가 호출된다.

 

ps2. ddd(int a)가 아예 없거나 ccc()대신 ddd(int a)를 호출한 경우에는 널포인터를 참조하게 되어 아래 에러가 뜬다.

"예외 발생(0x00000000, Test1.exe): 0xC0000005: 0x00000000 위치를 실행하는 동안 액세스 위반이 발생했습니다.."

Posted by 버블껌
하드웨어2019. 3. 5. 00:09

MR 해드셋이 인식 안되는 문제가 생겼었는데 윈도우 업데이트(KB4482887) 설치후 발생한 것으로 추정된다.

Mixed Reality 포털을 실행해도 아무런 반응이 없고 스팀VR에서도 헤드셋을 찾을수 없다고(108) 떴다.



해결 방법은 시작버튼 -> 설정 -> 혼합현실 -> 제거 -> 재부팅 -> Mixed Reality 포털 실행

다 필요 없고 MR을 PC에 연결한 뒤에 재부팅 하면 된다.

PC를 켤때 MR이 연결되어 있지 않으면 인식을 못한다.



Posted by 버블껌
게임2017. 7. 22. 13:19


군수지원.xlsx


오른쪽의 1이 붙은 부분은 1시간당 획득량과 순위

ps. 2017-07-28 : 7전역 업데이트, 밑의 엑셀 파일에 시간당 획득량 계산기 추가

ps2. 2017-08-05 : 부품에 3배의 가중치를 주던 부분 삭제, 엑셀 파일의 시간당 획득량 계산기 약간 개선

ps3. 2017-09-08 : 8전역 업데이트

ps4. 2017-12-22 : 9전역 업데이트

ps5. 2018-02-15 : 10전역 업데이트

Posted by 버블껌