🦃

gawkのデバッグ機能について

2021/08/22に公開

はじめに

glibcINSTALLに以下のような記載があります。

Recommended Tools for Compilation
... 省略

  • GNU 'awk' 3.1.2, or higher

    'awk' is used in several places to generate files. Some 'gawk'
    extensions are used, including the 'asorti' function, which was
    introduced in version 3.1.2 of 'gawk'. As of release time, 'gawk'
    version 5.1 is the newest verified to work to build the GNU C
    Library.

asortiって何?と思ったので調べてみました。

ドキュメント

gawkのドキュメントは以下。

https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html

あと以下。

https://www.gnu.org/software/gawk/manual/html_node/Array-Sorting-Functions.html

サンプル

以下のようなサンプルを書いてみました。

sample.awk
BEGIN {
    a["last"] = "de"
    a["first"] = "sac"
    a["middle"] = "cul"

    asort(a, b)
    asorti(a, c)
    
    for(i=1; i<=length(b); i++) print b[i];
    print "---"
    for(i=1; i<=length(c); i++) print c[i];

}

実行結果は以下

$ gawk -f sample.awk 
cul
de
sac
---
first
last
middle

gawkのデバッガ機能で見てみる

$ gawk -D -f sample.awk 
gawk> 

あとは、普通のデバッガのように
ブレークを貼ったり変数の値を表示させたりできます。
p @<変数名>で変数の情報が表示できます。
以下では、asort, asortiの結果の配列を表示させています。

gawk> break sample.awk:9
Breakpoint 1 set at file `sample.awk', line 9
gawk> run 
Starting program: 
Stopping in BEGIN ...
Breakpoint 1, main() at `sample.awk':9
9           for(i=1; i<=length(b); i++) print b[i];
gawk> 

gawk> p @a
a["first"] = "sac"
a["last"] = "de"
a["middle"] = "cul"
gawk> p @b
b["1"] = "cul"
b["2"] = "de"
b["3"] = "sac"
gawk> p @c
c["1"] = "first"
c["2"] = "last"
c["3"] = "middle"

表でまとめてみました。

変更前 asort(a, b) asorti(a, c)
a["first"] = "sac" b["1"] = "cul" c["1"] = "first"
a["last"] = "de" b["2"] = "de" c["2"] = "last"
a["middle"] = "cul" b["3"] = "sac" c["3"] = "middle"

https://www.gnu.org/software/gawk/manual/html_node/Finding-The-Bug.html

まとめ

もともとglibcに興味があって、
glibcのコードを見ていたのですが、
gawkについての記載が気になったので、このような記事を書いてみました。

Discussion