Why should I know this?

Self-Trace code 를 넣으면 좋은점 본문

Technic

Self-Trace code 를 넣으면 좋은점

die4taoam 2023. 2. 20. 23:50

개발자들은 주로 주석을 통해 많은 정보를 코드에 덧붙여놓는데 자체 Trace 코드를 추가하면 장점이 있습니다.

1. 복기에 좋다.

2. 유지보수에 좋다.

3. 후임자에게 인수인계하기 좋다.

4. 개발자 외에 관여자에게 설명하기 쉽다.

 

제가 권하고 싶은 log와 trace의 차이 및 활용법은 다음과 같습니다.

log는 개발 과정에서 세밀한 것들을 확인할 때 활용될 수 있는 메시지이고,
trace는 개발 외의 과정에서 프로그램의 동작을 확인할 때 활용될 수 있는 메시지 입니다.

 

다음 코드는 제가 작성한 코드 일부입니다.

 

/**
 *  Function : emulator
 *  -----------------------
 *  Determine if current device is an emulator
 * 
 *  returns : if current device is an emulator returns number bigger than 0. otherwise returns 0.
 */
LINKABLE_ATTRIBUTE
int emulator()
{
    TRACE_ENTER("if this device is an emulator returns number bigger than 0");
    int res = EMULATOR_NOT_FOUND;

    if ((res = check_emulator()) > 0)
        res = ERROR_GEN_SUB(ERROR_TYPE_EMULATOR, ERROR_EMUL_SUBTYPE_EMUL, res);
    else if ((res = check_nox()) > 0)
        res = ERROR_GEN_SUB(ERROR_TYPE_EMULATOR, ERROR_EMUL_SUBTYPE_NOX, res);
    else if ((res = check_memu()) > 0)
        res = ERROR_GEN_SUB(ERROR_TYPE_EMULATOR, ERROR_EMUL_SUBTYPE_MEMU, res);
    else if ((res = check_bluestack()) > 0)
        res = ERROR_GEN_SUB(ERROR_TYPE_EMULATOR, ERROR_EMUL_SUBTYPE_BLUESTACK, res);

    TRACE_EXIT_RET("results : %d", res);
}

 

위의 코드에서 TRACE_ENTER / TRACE_EXIT_RET 이라는 Macro가 Self-Trace를 위한 코드 입니다.

 

Facebook Redex에 구현된 코드를 대신 덧붙입니다.

https://github.com/facebook/redex/blob/fc930e21c5f492b923d728e2df79d9c721ae1594/libredex/Trace.h#L189

 

GitHub - facebook/redex: A bytecode optimizer for Android apps

A bytecode optimizer for Android apps. Contribute to facebook/redex development by creating an account on GitHub.

github.com

( Redex에서 사용하는 TRACE 매크로는 기능상 유사한 구현이지만 활용은 로그처럼 하고 있네요 ^^; )

 

함수 호출은 depth가 적은 편이 좋다고 생각하는데, 대충 다음과 같은 Depth를 활용합니다.
Depth 1 단계 = 기능을 담당하는 함수 (ex. 에뮬탐지)
Depth 2 단계 = 기능의 대단위 (ex. 에뮬 중에 nox 탐지)
Depth 3 단계 = 기능의 소단위 (ex. nox 를 탐지하기 위한 세분화된 구현)

Trace는 주로 Depth의 1~2 단계에 해당 기능의 구현과 리턴 값에 대한 해설을 함께 달아놓습니다.

 

위의 Trace로그는 다음과 같이 표현될겁니다.

emulator : if this device is an emulator returns number bigger than 0

emulator : results : 0

 

위처럼 표시되는 로그 포맷만 학습하면, 지금 어떤 기능이 동작했는지, 어떤 동작이 정상인지 비정상인지

개발자가 별도의 고지나 추가적인 정보 전달 없이, 실행간 제공되는 LOG메시지와 실제 기능의 작용 여부를
직관적으로 확인할 수 있게 됩니다.

 

이는 비단 다른 부서와의 협업에만 유리한 것은 아니고,
해당 프로젝트를 이어받을 후임에게도 좀더 직관적으로 다가가지 않을까 하는 생각을 합니다.

 

 

Comments