Debugging

아래의 스크립트는 어디가 잘못되었을까요? 자세히 보면 getine( getline ), prit( print ) 에 typo 오류가 있습니다. 하지만 이것은 awk 문법에 있어서 변수로 취급되어 오류가 되지 않기 때문에 값이 아무것도 표시되지 않을 뿐이지 정상적으로 실행이 됩니다.

$ awk 'BEGIN { getine var < "file1"; prit var }'   # 정상적으로 실행된다.
$

이때 --lint 옵션을 사용하면 기존에는 볼 수 없었던 다양한 메시지를 볼 수 있습니다.

$ awk --lint 'BEGIN { getine var < "file1"; prit var}' 
awk: cmd. line:1: warning: statement may have no effect
awk: warning: statement may have no effect
awk: cmd. line:1: warning: reference to uninitialized variable 'getine'
awk: cmd. line:1: warning: reference to uninitialized variable 'var'
awk: cmd. line:1: warning: reference to uninitialized variable 'prit'
awk: cmd. line:1: warning: reference to uninitialized variable 'var'

awk 는 실행파일이 1M 도 안되는데 (660k 정도) 자체 내장 디버거가 있습니다. 이전에 gdb 를 사용해본 경험이 있으면 어렵지 않게 사용하실 수 있습니다. readline 라이브러리를 사용하므로 shell 에서처럼 history 와 라인 에디팅 기능을 사용할 수 있습니다.

다음은 실제 디버깅을 하는 영상입니다. 디버깅을 할때는 항상 코드를 파일로 만들어서 해야 합니다.

-o, --pretty-print 옵션을 이용해 파일을 생성할 수 있습니다.

$ cat transpose.awk 
{
    for(i=1; i<=NF; i++)
        r[i]=r[i] sep $i
    sep=FS
} 
END {
    for(i=1; i<=NF; i++) 
        print r[i]
}
..................................

$ cat matrix 
a1;a2;a3;a4;a5
b1;b2;b3;b4;b5
c1;c2;c3;c4;c5
d1;d2;d3;d4;d5
..................................

$ awk -F\; -f transpose.awk matrix
a1;b1;c1;d1
a2;b2;c2;d2
a3;b3;c3;d3
a4;b4;c4;d4
a5;b5;c5;d5
..................................

# 명령 옵션으로 '-D' 를 사용하면 디버깅을 할 수 있습니다.
$ awk -D -F\; -f transpose.awk matrix
gawk> ....

[ 예제 출처 ] http://backreference.org/2010/02/10/idiomatic-awk/

Main Debugger Commands

https://www.gnu.org/software/gawk/manual/html_node/Debugger.html

Breakpoint ControlControl of Breakpoints.
Debugger Execution ControlControl of Execution.
Viewing And Changing DataViewing and Changing Data.
Execution StackDealing with the Stack.
Debugger InfoObtaining Information about the Program and the Debugger State.
기타 Debugger CommandsMiscellaneous Commands.

Profiling

https://www.gnu.org/software/gawk/manual/html_node/Profiling.html