Since I’ve been asking people to try the recipes app with Flatpak, I can’t complain too much if I get bug reports back. But how does one create a useful bug report when something goes wrong in a Flatpak sandbox ? Some of the stacktraces I’ve seen have not been very useful, since they are lacking symbols.
This post is a quick attempt to spread some basics about Flatpak debugging.
Normally, you run your Flatpak app like this:
flatpak run org.gnome.Recipes
Well, that’s not quite true; the ”normal” way to launch the Flatpak is just the same as launching a non-Flatpak app: click on the icon, or hit the Super key, type recipes, hit Enter. But lets assume you’re launching flatpak from the commandline.
What happens behind the scenes here is that flatpak finds the metadata for org.gnome.Recipes, determines which runtime it needs, sets up the sandbox by mounting the app in /app and the runtime in /usr, does some more sandboxy stuff, and eventually launches the app.
First problem for bug reporting: we want to run the app under gdb to get a stacktrace when it crashes. Here is how you do that:
flatpak run --command=sh org.gnome.Recipes
Running this command, you’ll end up with a shell prompt ”inside” the recipes sandbox. This is great, because we can now launch our app under gdb (note that the application gets installed in the /app prefix):
$ gdb /app/bin/recipes
Except… this fails because there is no gdb. Remember that we are inside the sandbox, so we can only run what is either shipped with the app in /app/bin or with the runtime in /usr/bin. And gdb is not among either.
Thankfully, for each runtime, there is a corresponding sdk, which is just like the runtime, except it includes the stuff you need to develop and debug: headers, compilers, debuggers and other useful tools. And flatpak has a handy commandline option to use the sdk instead of the regular runtime:
flatpak run --devel --command=sh org.gnome.Recipes
The –devel option tells flatpak to use the sdk instead of the runtime and do some other things that make debugging in the sandbox work.
Now for the last trick: I was complaining about stacktraces without symbols at the beginning. In rpm-based distributions, the debug symbols are split off into debuginfo packages. Flatpak does something similar and splits all the debug information of runtimes and apps into separate ”runtime extensions”, which by convention have .Debug appended to their name. So the debug info for org.gnome.Recipes is in the org.gnome.Recipes.Debug extension.
When you use the –devel option, flatpak automatically includes the Debug extensions for the application and runtime, if they are available. So, for the most useful stacktraces, make sure that you have the Debug extensions for the apps and runtimes in question installed.
Hope this helps!
Most of this information was taken from the Flatpak wiki.
Is there something like abrt for flatpak that would do all that automatically?
Not yet. But it could be an interesting idea to teach abrt about flatpak sandboxes.
Filed a bug about it some time ago: https://github.com/abrt/abrt/issues/1196
ABRT devels are already working on support for apps in Docker containers.