unity-dev team mailing list archive
-
unity-dev team
-
Mailing list archive
-
Message #00250
[Ayatana-dev] [SOLVED] Re: [Compiz] Unity failing to load
Problem solved, and since it was such a pain, and no one seemed to know, I
thought I'd share the solution.
On Mon, 01 Aug 2011 13:23:13 Tim Penhey wrote:
> Hi people,
>
> I'm probably doing something stupid, but I'm not sure what it is.
It was stupid. Kudos to Jason for helping me install debug packages [1] as to
step through in gdb.
> function unity-env
> {
> export PATH=~/staging/bin:$PATH
> export XDG_DATA_DIRS=~/staging/share
> export LD_LIBRARY_PATH=~/staging/lib:$LD_LIBRARY_PATH
> export LD_RUN_PATH=~/staging/lib:$LD_RUN_PATH
> export PKG_CONFIG_PATH=~/staging/lib/pkgconfig
> export PYTHONPATH=~/staging/lib/python2.7/site-packages
> }
>
> Anyone got any clues?
It was suggested that I change the exports to include the existing directories
when there were some, so this was updated to:
export PATH=~/staging/bin:$PATH
export XDG_DATA_DIRS=~/staging/share:${XDG_DATA_DIRS}
export LD_LIBRARY_PATH=~/staging/lib:${LD_LIBRARY_PATH}
export LD_RUN_PATH=~/staging/lib:${LD_RUN_PATH}
export PKG_CONFIG_PATH=~/staging/lib/pkgconfig:${PKG_CONFIG_PATH}
export PYTHONPATH=~/staging/lib/python2.7/site-packages:$PYTHONPATH
However that made zero difference.
I installed libgdk-pixbuf2.0-dev-dbgsym (and libgdk-pixbuf2.0-dbgsym, not sure
if I needed both), and then grabbed the source using:
$ apt-get source libgdk-pixbuf2.0-dev
in my ~/sandbox directory.
I then debugged compiz in vt2 using
$ gdb compiz -d ~/sandbox/gdk-pixbuf-2.23.5/gdk-pixbuf [2]
Prior to running, did
b PlacesStyle::TextureFromFilename [3]
run --replace
Then I stepped into the gdk_pixbuf_new_from_file call. This lead me into some
gio functions which were not returning the correct module. So off to install
the debug symbols for libglib-2.0 and the souce.
I finally stepped into a suspect looking piece of code that was checking
XDG_DATA_DIRS. It was just prior to this where I was starting to step through
methods starting with xdg_ that I was starting to get some clue as to what was
going on as I had remembered that XDG_DATA_DIRS was being updated.
I had been also stepping through and debugging a very simple app that Neil
Patel wrote for me to test the function locally
(http://paste.ubuntu.com/656253/), but that one was working. Also that call
never got to anything checking XDG_DATA_DIRS, only XDG_DATA_HOME [4]
The offending area of code is
/glib2.0-2.29.14/gio/xdgmime/xdgmime.c line 258
> xdg_data_dirs = getenv ("XDG_DATA_DIRS");
> if (xdg_data_dirs == NULL)
> xdg_data_dirs = "/usr/local/share/:/usr/share/";
Now... lets look again at what I had.
export XDG_DATA_DIRS=~/staging/share:${XDG_DATA_DIRS}
My system compiz and unity environment worked fine because this environment
variable was not set at all. So in those situations it used
"/usr/local/share/:/usr/share/". However when I tried to add something to
this environment variable, I had
$ echo ${XDG_DATA_DIRS}
/home/tim/staging/share:
Which is clearly not NULL.. I updated my function to set the environment to
instead say:
export XDG_DATA_DIRS=~/staging/share:/usr/local/share/:/usr/share/
And then it is all working lovely.
Lessons learnt:
* gdb, while awesome, is a real pain to do a lot of stepping through
* installing debug symbols isn't enough to step through code in gdb
* apt-get source rocks
* special default locations *should* (IMO) be additive
I hope some of you find this useful.
Tim
[1] https://wiki.ubuntu.com/DebuggingProgramCrash, steps 1, 3 and 4
[2] -d (or directory once inside gdb) gives gdb another location to look for
files.
[3] Even thought the library isn't loaded, gdb will let you set a pending
breakpoint which it checks on loading libraries.
[4] This is a guess, but there is an env setting XDG_SESSION_COOKIE which I'm
guessing is used across process for shared memory access to standard mimetype
stuff, hence the local app not looking through XDG_DATA_DIRS
Attachment:
signature.asc
Description: This is a digitally signed message part.
Follow ups
References