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