Re: Logging tools
- Posted by jimcbrown (admin) May 17, 2015
- 1610 views
@Developers,
Is there some way to bring some Euphoria internal parser / trace variables in as readable by the user Euphoria code?
For example, the name of the current procedure/function we are in, maybe a sequence containing the call stack, and the source line number.
Uhm, the answer to this is in the first post of this thread.
This would simplify this somewhat ugly and repetitive code I am doing at the moment:
------------------------------------------------------------------- function shared_vm_usage(sequence servername) -- v530 sequence s1, s2 integer i1, i2 s1 = {} s1 = append(s1,"shared_vm_usage") s1 = append(s1,debug_level) s1 = append(s1,03751) s2 = {} s2 = append(s2,servername) s1 = append(s1,s2) program_debug(s1) i2 = 0 s1 = get_hardware_serial(servername) i1 = find_from(s1,vm_server_serials,1) if i1 > 0 then i2 = vm_server_inuse[i1] end if return i2 end function --------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------- -- standard debug procedure procedure program_debug(sequence passed_sequence) sequence caller_name, caller_vars, s1, s2, s3, s4 integer caller_debug_level, caller_line_nr, i1, i2, i3, i4 object o1 i1 = 0 i2 = 0 caller_name = passed_sequence[1] caller_debug_level = passed_sequence[2] caller_line_nr = passed_sequence[3] caller_vars = passed_sequence[4] -- store the call counts per routine if debug > 2 if caller_debug_level > 2 then -- only if debug is not 0 i1 = find_from(caller_name,procmap,1) if i1 = 0 then procmap = append(procmap,caller_name) procmap_line = append(procmap_line,caller_line_nr) procmap_count = append(procmap_count,1) i1 = i1 + 1 else procmap_count[i1] = procmap_count[i1] + 1 end if -- show the calling results of named procs if find_from(caller_name,dump_proccount,1) !=0 then i2 = 0 while i2 < length(procmap) do i2 = i2 + 1 s1 = procmap[i2] if compare(caller_name,s1) = 0 then s2 = sprintf("%g",{procmap_count[i2]}) s4 = sprintf("%g",{procmap_line[i2]}) writelog("Debug 3 Routine " & s1 & " at line " & s4 & " has count "& s2) end if end while end if end if -- turn on trace for specified procedure/function in config if caller_debug_level > 3 then if find_from(caller_name,trace_names,1) != 0 then trace(1) else trace(0) end if end if -- if i2 > 0 then s4 = sprintf("%g",{procmap_line[i2]}) end if if i1 > 0 then s4 = sprintf("%g",{procmap_line[i1]}) end if if caller_debug_level = 3 then -- don't do this for level 4 as well if find_from(caller_name,hidetrace,1) = 0 then -- v512 supress certain known calls writelog("Debug 3 Routine '" & caller_name & "' called at line " & s4) else if procmap_count[i1] = 1 then -- always show the first time its called writelog("Debug 3 Routine '" & caller_name & "' called at line " & s4) end if end if end if if caller_debug_level > 3 then i4 = 0 i3 = 0 s1 = {} while i4 < length(caller_vars) do i4 = i4 + 1 o1 = caller_vars[i4] if sequence(o1) then s2 = o1 s1 = s1 & s2 & " " i3 = 1 end if if integer(o1) then i2 = o1 s3 = sprintf("%g",{i2}) s1 = s1 & s3 & " " i3 = 1 end if if atom(o1) then i2 = o1 s3 = sprintf("%g",{i2}) s1 = s1 & s3 & " " i3 = 1 end if if i3 = 0 then -- assume object if not atom/int/seq s2 = o1 s1 = s1 & s2 & " " i3 = 1 end if end while if find_from(caller_name,hidetrace,1) = 0 then -- v512 supress certain known calls writelog("Debug 4 Routine '" & caller_name & "' called at line " & s4 & ", passing vars " & s1) else if procmap_count[i1] = 1 then -- always show the first time its called writelog("Debug 4 Routine '" & caller_name & "' called at line " & s4 & ", passing vars " & s1) end if end if end if end procedure -------------------------------------------------------------------
Where program_debug is being passed the name, line number, variables etc
Most of that (other than caller_vars) can be obtained from passing call_stack() in. To get the variables would probably require something tricky like hooking display_var() and using symbol_lookup() and/or get_symbol_table() (all in include/euphoria/debug/debug.e).