登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

聊天机器

Chatbot's private blog

 
 
 

日志

 
 

ruby调试器制作记录  

2017-04-29 14:35:27|  分类: 程序理论 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1、断点不要直接用rb_add_event_hook,此函数会对使用一些内部处理的地方也会断进来导致循环出错
应该使用debug下的创建tracePoint的效果
m_trace[eCall] = rb_tracepoint_new( 0, RUBY_EVENT_CALL, HookProc, this );
m_trace[eLine] = rb_tracepoint_new( 0, RUBY_EVENT_LINE, HookProc, this );
m_trace[eReturn] = rb_tracepoint_new( 0, RUBY_EVENT_RETURN, HookProc, this );

2、rb_tracepoint_enable 会对point进行调试,不能多次执行,内部没有做判断。必须disable后再enable。

3、堆栈深度有多种获取方式。这里只是其中一种
int32 CMRubyDebuger::GetRunningStackLevel()
{
struct SCallBack
{
static VALUE OnInspector( const rb_debug_inspector_t * pIns, void * p )
{
VALUE bt = rb_debug_inspector_backtrace_locations( pIns );
*(int32 *)p = rb_array_len( bt );

return Qnil;
}
};

int32 nFrameSize = 0;
rb_debug_inspector_open( &SCallBack::OnInspector, &nFrameSize );
return nFrameSize;
}

4、断点行数使用较为简单的处理,按照源码来看,这个v可有可无
rb_trace_arg_t * arg = rb_tracearg_from_tracepoint( v );
int32 currentline = FIX2INT( rb_tracearg_lineno( arg ) );
VALUE vPath = rb_tracearg_path( arg );
CMString source = StringValuePtr( vPath );

5、rb_iv_get及rb_gv_get能获取类成员变量及全局变量,局部变量不能同过跳过堆栈层级获取,按照一个文档说是获取不了。但当前的局部变量,还是可以同过执行一句ruby语句获取,rb_eval_string_protect发挥很大效果
  评论这张
 
阅读(195)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018