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发挥很大效果
评论