nif(c/c++ shared object)를 erlang runtime에 올려서 쓰다보면 gdb를 사용할 일이 생긴다.
/usr/bin/erl은 shell script다.
그 내용을 보고 환경변수만 맞추어주면 된다. 아래처럼 한다.
# (emacs라면, M-x gdb 후에)
gdb --annotate=3 /usr/lib/erlang/erts-5.8.5/bin/beam.smp
......
(gdb) set environment ROOTDIR /usr/lib/erlang
(gdb) set environment BINDIR /usr/lib/erlang/erts-5.8.5/bin
(gdb) set environment EMU beam
(gdb) set environment LD_LIBRARY_PATH /path/to/lib:/usr/local/lib:/usr/lib # optional, 은밀한(?) 곳에 so가 있다면 설정.
(gdb) cd /path/to/working/dir # optional, 보통 beam.smp가 있는 곳으로 cwd가 바뀌므로 다시 설정한다.
(gdb) r -- -root /usr/lib/erlang -progname erl -- -home /path/to/home -- -sname optional-node-short-name -pa ./ebin
......
주의할 점은, erlang REPL에 들어가고 나면 마땅히 break point를 설정할 방법이 없으므로 REPL 진입전에 break point를 설정해야 한다는 것이다.
happy hackin'
2014-12-22 추가:
참고 링크(이게 더 간단한가?) http://blog.dizzyd.com/blog/2009/12/18/running-erl-in-a-debugger/
요점은 bin/erl을 이렇게 바꾸고 실행한다.
if [ ! -z "$USE_GDB" ]; then gdb $BINDIR/erlexec --args $BINDIR/erlexec ${1+"$@"} else exec $BINDIR/erlexec ${1+"$@"} fi