2020년 7월 1일 수요일

Bad Alloc 로그따기

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

#pragma once

#include <new>

#include <string>

#include <Windows.h>

#define START_ALLOC { ExceptionCatcher::Get()->StartAlloc(__func__, __LINE__); }

#define END_ALLOC { ExceptionCatcher::Get()->EndAlloc(); }

void __cdecl Bad_Alloc_Handler();

class ExceptionCatcher

{

public:

ExceptionCatcher() { std::set_new_handler(Bad_Alloc_Handler);};

~ExceptionCatcher() {};

static ExceptionCatcher* Get() { static ExceptionCatcher instance; return &instance; }

std::string GetErrorMessage() { return "Fail to Alloc Memory in " + _funcName_stack.top() + " at " + std::to_string(_nLine_stack.top()); }

void StartAlloc(const std::string& funcName, const int& nLine)

{

_funcName_stack.push(funcName);

_nLine_stack.push(nLine);

}

void EndAlloc() { _funcName_stack.pop(); _nLine_stack.pop(); }

static std::stack<std::string> _funcName_stack;

static std::stack<int> _nLine_stack;

};

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#include "Framework.h"

#include "ExceptionHandler.h"

#include "Log.h"

std::stack<std::string> ExceptionCatcher::_funcName_stack;

std::stack<int> ExceptionCatcher::_nLine_stack;

void __cdecl Bad_Alloc_Handler()

{

LOG_ERROR(ExceptionCatcher::Get()->GetErrorMessage().c_str());

// MessageBoxA(nullptr, ExceptionCatcher::Get()->GetErrorMessage().c_str(), 0, 0);

throw std::exception();

}

release 파일에서 동적할당이 실패시 로그따야하므로 만듬

new 있는데마다 START_ALLOC, 끝나고 END_ALLOC 해줘야하는 번거로움이 있으나

생각보다 동적할당하는데가 많지 않아서 try catch 보단 나은거 같은데

동시에 많지 않으니까 오히려 try catch 가 나은거 같기도 하고

현업에선 어떻게 쓰는지 모르겠음.

댓글 없음:

댓글 쓰기

List