2019. 9. 5. 17:05 기타 상식
함수 호출 정보에 관하여
프로그래밍을 하다보면 보통 개발 단계에서 디버깅 로그 혹은 디버그 모드 등을 통해서
로직의 수행 단계 혹은 특정 객체의 정보등을 확인한다.
일반적인 경우 디버깅 모드에서 일일히 확인해도 가능하지만
스레드와 관련된 내용은 단순 호출 스택으로 확인하기에는 제한사항이 많다.
이러한 경우 보통 해당 로직을 호출한 함수, line등의 정보를 각 언어별로 제공하는 방법이 따로 있다.
C#의 경우
1. GetCurrentMethod() 함수의 사용.
2. StackTrace 사용
3. Caller Information 클래스 사용
간단하게 설명하자면 GetCurrentMethod()함수의 경우 해당 함수를 내부에서 호출한 함수의 정보를 담아서 전달하며
해당 함수의 속성, 예를 들면 Name, IsPublic, IsStatic 등의 정보를 담고 있지만,
이 경우 GetCurrentMethod()를 통해 X함수에서 호출된 것은 알 수 있지만 X의 몆번째 line에서 호출됐는지는 모른다.
StackTrace 를 사용하는 경우 GetCurrentMethod() 와는 다르게 호출된 line까지 확인이 가능하다.
다만 StackTrace는 4.5 버전 미만에서 지원되며 실질적으론 StackTrace를 얻은 후 다시 StackFrame을 얻고
StackFrame을 통해서 FlieName, MethodName, Line 정보를 얻을 수 있다.
Caller Information의 경우 StackTrace와 같은 역할이지만 좀더 간편하게 사용할 수 있다.
CallerFilePathAttribute / CallerLineNumberAttribute / CallerMemberNameAttribute 3개의 어트리뷰트이다.
사용 방법 역시 매우 간단한데 아래와 같이 사용하면 된다.
public void LogTrace(string _log, [CallerMemberName]string _callerName = "", [CallerLineNo]string _lineNo)
{
Console.WriteLine($"[{_callerName}|{_lineNo}]-{_log}");
}
다만 Caller Information의 경우 4.5이상에서 사용가능하며 아직은 기능이 그렇게 많지 않다는 단점이 있다.
위에서는 C#의 예를 들었지만 각 언어별 함수 호출 정보를 획득할 수 있는 방법들이 있을 것이다.
[C++의 경우 __LINE__ 키워드라던가]
자신이 사용하는 언어는 어떤 방법을 제공하고 있는지 알아두면 좋을 것이다.
'기타 상식' 카테고리의 다른 글
software license 에 대하여. (0) | 2020.05.27 |
---|---|
프로그램에서 CPU 시간정보 얻는법 (0) | 2019.09.20 |
게임에서의 랜덤값에 대해서 (0) | 2019.09.02 |
FirebaseMessage 란? (0) | 2019.07.31 |
멀티 스레드에 관해서 (0) | 2019.07.14 |