make check fails on AIX 5.3

Ken Raeburn raeburn at MIT.EDU
Sat Aug 15 02:17:57 EDT 2009


On Aug 14, 2009, at 18:28, Gavin Sherry wrote:
> The issue is that com_err_initialize() is being called more than  
> once. The
> first time, it is done via krb5int_initialize_library(), the second  
> via the
> bt above. This should be guarded by pthread_once(), but that's not  
> working
> (although, I've verified that in a trivial program pthread_once() is
> behaving as expected).

Strange....  We do definitely depend on pthread_once behaving itself.

> Here's some more debugging info. Before the first call,
> com_err_initialize__once is set to:
>
> $2 = {once = {__on_word = {0, 0, 0, 0, 0, 0, 0, 2, 0 <repeats 20  
> times>}},
> error = 0, did_run = 0, fn = @0xf08d61dc: 0xd21f3eb4
> <com_err_initialize__aux>}
>
> After the first call:
>
> $4 = {once = {__on_word = {1, 0, 0, 0, 0, 0, 0, 9, 0 <repeats 20  
> times>}},
> error = 0, did_run = 1, fn = @0xf08d61dc: 0xd21f3eb4
> <com_err_initialize__aux>}
>
> Before the second call:
>
> $5 = {once = {__on_word = {2, 0, 0, 0, 0, 0, 270008407, 9, 1, 0  
> <repeats 19
> times>}}, error = 0, did_run = 1, fn = @0xf08df2dc: 0xd21eefb4
> <com_err_initialize__aux>}

I'm not 100% sure when you say "call" which function you're referring  
to.  Is "after the first call" after com_err_initialize__aux returns  
but pthread_once is still in progress, or after pthread_once returns?

It's also very interesting to me, though, that the "fn" field changes  
value in between $4 and $5, but it still seems to refer to the same  
function address.  Is it possible two copies of the library have been  
loaded at different addresses, with different com_err_initialize__*  
values, but sharing a common libkrb5support library with its internal  
thread-support data?  If that's so, I could imagine gdb showing you  
different locations for "print com_err_initialize__once" depending on  
the current execution context.  Try printing the addresses of these  
symbols in each context, and/or using "info sharedlibrary" in gdb.

Getting only one copy of the krb5 library (and friends) is also kind  
of assumed in our code -- or, at least, if you get multiple copies,  
you get multiple copies of the whole set with symbolic references  
resolved within each set.  We may or may not be setting all the right  
flags to encourage the OS to make the latter happen....

> Now, I set a watch point in the debugging to stop when this  
> structure is
> changed. GDB does not break between the first and second calls. This  
> might
> be a short coming of GDB, I'm not sure.

Yeah, there are sometimes environments or cases where it doesn't seem  
to work well.  Make sure you report that, especially if you can narrow  
down a simple test case.  If your watch expression is something like  
"com_err_initialize__once.once.__on_word[0]", and the problem really  
is loading two libraries (or copies of the same library) that define  
com_err_initialize__once, it's an interesting question whether the  
watchpoint should trip as a result of the execution location (program  
counter) changing so that gdb would find one version of the variable  
instead of the other.  But if it is the same location the whole time,  
and it changes without the watchpoint tripping, it sounds like a gdb  
bug.

Ken



More information about the krbdev mailing list