您的位置:首页 > 其它

erlang vm debug 调试编译

2017-05-09 11:52 337 查看
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


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  erlang