erlang vm debug 调试编译

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

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值