On Monday 14. May 2018 22.06.06 Paul Boddie wrote:
On Monday 14. May 2018 21.18.04 Adam Lackorzynski wrote:
You can set LD_DEBUG=1 in the environment of your program to make the dynamic loader tell you something. LD_TRACE_LOADED_OBJECTS=1 might also be of help. Add enviroment variable settings after the program's cmdline: ...:start({ ...}, "rom/myprog arg", { LD_DEBUG=1, ... });
I imagine I could direct log information to a suitable program for display on the screen rather than via the serial console. Can I do this using something like fbterminal? I'm still getting to grips with the different mechanisms accessed and exposed by the different programs.
Maybe the matter of configuring fbterminal as a logging destination is obvious to those better acquainted with L4Re, but I eventually figured it out in a way. What I needed to do is to provide a different "log" capability to the hello program, but this is perhaps easier said than done.
According to the documentation...
http://l4re.org/doc/l4re_servers_ned.html#l4re_ned_startup
...it is supposed to be possible to indicate a log factory that creates a suitable object using the "log_fab" property/attribute of the loader.
Looking at the Lua code (pkg/l4re-core/ned/server/src/ned.lua), the App_env:log function seems to be the thing that gets called, returning the desired capability:
return self.loader.log_fab:create(Proto.Log, table.unpack(self.log_args));
While, I guess I might make a suitable loader available with code that looks like this...
local l2 = L4.Loader.new({loader = l, log_fab = term});
...and then use it to start the hello program...
l2:start({ log = { "hello", "b" }, }, "rom/hello");
...the challenge is to specify something that can *create* the logging destination. In my .cfg script, "term" is actually the IPC gate (or "channel") capability exposing the fbterminal:
local term = l:new_channel();
l:start({ caps = { fb = mag_caps.svc:create(L4.Proto.Goos, "g=800x460+0+0", "barheight=20"), term = term:svr(), }, }, "rom/fbterminal");
So, as far as I can see, I would need something that acts as a factory capable of providing a fbterminal capability when its create method is invoked (specifying the log protocol). This seems like a lot of effort.
It then occurred to me that I only really want a way of presenting the "term" capability to the hello program. Since this isn't obviously possible in the loader, I modified the App_env:log function to support an additional case:
if self.log_cap then return self.log_cap elseif self.loader.log_fab == nil or self.loader.log_fab.create == nil then error ("Starting an application without valid log factory", 4); end
Thus, if "log_cap" is indicated when starting a program, it just uses this instead of trying to conjure up another capability. So the hello program is started as follows:
l:start({ log_cap = term, }, "rom/hello");
This manages to log to fbterminal, much to my relief. I hope this helps anyone else who struggled with this or just wondered about it.
Paul