보조 디버깅

2512 단어
본 논문은 Lua 코드와 상관없이 디버깅을 위한 C 코드를 썼을 뿐 코드 읽기의 난이도를 낮출 수 있다.모든 함수체의 첫 문장에 DEBUGFLAG를 쓰면 됩니다.Lua 스크립트를 통해 각 함수의 디버그 동작을 제어할 수 있습니다.디버그 행위는 단점, printf 함수 이름, fprintf 함수 이름을 포함합니다.flag 하나만 있으면 기존 코드를 너무 많이 수정할 필요가 없습니다.예:
int main()
{
    DEBUGFLAG
    return 0;
}
:
main{
}
출력된 함수 이름은 축진 형식을 띠고 함수체를 괄호로 표시한다.이런 격식은 함수 간의 호출 관계를 뚜렷하게 볼 수 있다.다음
lua.c의 호출 관계.
main{
  pmain{
    collectargs{
    }
    handle_luainit{
    }
    runargs{
    }
    handle_script{
      getargs{
      }
      docall{
      }
      report{
      }
    }
  }
  finalreport{
  }
}
루아 스크립트를 통해 모든 함수의 디버깅 행위를 제어한다. 다음은 루아를 제어한다.c의 루아 스크립트, 이런 스크립트를 만드는 것은 매우 간단합니다. 함수의 이름은 VS2012의 클래스 보기에서 대량으로 복사하고 붙일 수 있으며 하나하나의 입력이 필요하지 않습니다.
--act: 1 assert, 2 printf, 3 fprintf

funcTable = 
{
 dbg_collectargs = 2
,dbg_docall  = 2
,dbg_dofile  = 2
,dbg_dolibrary  = 2
,dbg_dostring  = 2
,dbg_dotty  = 2
,dbg_finalreport  = 2
,dbg_get_prompt  = 2
,dbg_getargs  = 2
,dbg_handle_luainit  = 2
,dbg_handle_script  = 2
,dbg_incomplete  = 2
,dbg_l_message  = 2
,dbg_l_sin  = 2
,dbg_laction  = 2
,dbg_loadline  = 2
,dbg_lstop  = 2
,dbg_main  = 2
,dbg_pmain  = 2
,dbg_print_usage  = 2
,dbg_print_version  = 2
,dbg_pushline  = 2
,dbg_report  = 2
,dbg_runargs  = 2
,dbg_stackDump = 2
}

for key, value in pairs(funcTable) do
    funcTable[key] = 3
end
쉽게 구분하기 위해 함수마다 "dbg"선두에 서다.Action 함수는 논리 처리를 실현합니다. 루아 스크립트에서 이 함수 이름의value를 찾고,value의 값에 따라 assert로 되돌아오거나 텍스트로 출력합니다.나는 Action에서 assert를 직접 진행하지 않았다. 왜냐하면 이것은 매번 끊어진 위치가 Action에서 발생하기 때문에 좀 번거롭기 때문이다.g_callStackIndex는 현재 창고의 깊이를 기록하는 데 사용되며, 깊이가 출력 결과에 반영되면 함수 이름 앞의 빈칸입니다.
//act: 1 assert, 2 printf, 3 fprintf
int Action(const char *funName)
{
    if(Debug_GL == NULL)InitGL();
    char tname[100];
    sprintf(tname, "dbg_%s", funName);
    lua_getfield(Debug_GL, -1, tname);
    if(!lua_isnumber(Debug_GL, -1))
    {
        return 0;
    }
    int act = lua_tointeger(Debug_GL, -1);
    lua_pop(Debug_GL, 1);
    if(act == 1) ;
    else if(act == 2)
    {
        for(int i = 0; i < g_callStackIndex; i ++)
            printf("  ");
        printf("%s{
", funName); } else if(act == 3) { for(int i = 0; i < g_callStackIndex; i ++) fprintf(Debug_fp, " "); fprintf(Debug_fp, "%s{
", funName); } return act; }

좋은 웹페이지 즐겨찾기