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 Control | Control of Breakpoints. |
Debugger Execution Control | Control of Execution. |
Viewing And Changing Data | Viewing and Changing Data. |
Execution Stack | Dealing with the Stack. |
Debugger Info | Obtaining Information about the Program and the Debugger State. |
기타 Debugger Commands | Miscellaneous Commands. |
Profiling
https://www.gnu.org/software/gawk/manual/html_node/Profiling.html