1. download source code
tar -xzvf otp_src-18.3.tar.gz
2. cd /root/source/otp_src_18.3
3. export ERL_TOP=`pwd`
4. cd $ERL_TOP/erts/emulator
5. make TYPE=debug smp plain (这里和官网的文档不一样,用官网的生成结果不正确)
6. $ERL_TOP/bin/cerl -debug
$ERL_TOP/bin/cerl -debug -gdb (emacs环境)
$ERL_TOP/bin/cerl -debug -rgdb (纯gdb环境)
用gdb调试一下nif吧
1. ./cerl -debug -rgdb -s tu init 运行起来调试器
2. b twiddle_nif
出现: Function "twiddle_nif" not defined.
Make breakpoint pending on future shared library load?
y 回车。
3. tu:twiddle({{3,4},5}).
4. 进入了动态库的调试了。
Breakpoint 1, twiddle_nif (env=0x7ffff2d3add0, argc=1, argv=0x7ffff6448280) at tu.cpp:20
20 auto tup_in = make_tuple( make_tuple(ref(a), ref(b)), ref(c) );
5. l 看看源代码:
static ERL_NIF_TERM twiddle_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
16 {
17 try
18 {
19 int a,b,c;
20 auto tup_in = make_tuple( make_tuple(ref(a), ref(b)), ref(c) );
21 nifpp::get_throws(env, argv[0], tup_in);
22 return nifpp::make(env, make_tuple( c, make_tuple(b, a)));
23 }
24 catch(nifpp::badarg) {}
成功了,这样就可以调试nif 的so了。
参考:
https://gist.github.com/studzien/773baa48a432e70021c2
https://gist.github.com/gburd/4157112/5650f7718b05a4b518b91e4bab172e4f4a290141