[lug] good assert library

D. Stimits stimits at attbi.com
Thu Sep 19 01:17:09 MDT 2002

Chan Kar Heng wrote:
> :)
> thanks.. it's cool...
> i tried this... gcc -rdynamic -g -O0 a.c
> and i get a lot of hex addresses instead of function names...
> is this the expected output?

I haven't used this code in about a year, I recall having only hex 
addresses until the right option combination was used. You might 
experiment with leaving out any -O#; but once it is found, it will give 
you not hex, but plain English function names. You might also find it 
varies with the version of glibc and gcc/g++ that you use, but I am not 
positive. If you can't find the right arguments to get symbolic output, 
I can experiment with some of my old code and find out. I doubt it 
matters, but one detail of the last project I used this on compiled and 
linked in separate Makefile stages, where the -rdynamic was only in the 
linker stage; the -g was only in the intermediate object compile stage. 
Separation of stages without going directly from .c to executeable could 
allow a finer-grained testing of compile switches.

> anyway, would you know what gets sent across network in
> the case where machine A runs an X opengl program that
> resides on machine B? (remote X)...

I believe there is an OpenGL intercept/proxy library that can be used to 
catch OpenGL calls and log them, sort of like ltrace or strace for 
normal library or system calls. What I don't know is if any of these are 
available under Linux, I know there are several under Win32. Some names 
for Win32 side, which might or might not have a Linux version:
  Chromium, glTrace, HijackGL, GPT, ZapDB

(and even if they do have Linux versions, they might not be what you 
want, and they might fail under remote X11)

You might be more interested in using a network sniffing tool on the X11 
port. There is a possibility that if compression is being used over the 
network, you could find the right arguments to make X11 *not* compress, 
to aid debugging.

> either arguments of opengl function calls get sent or the
> rendered images on the window get compressed and sent.
> i'm wondering which... or maybe it works another way?

I couldn't answer that, you are at the driver level there, for both 
OpenGL and X11. X11 tends to have a surrogate copy of state on both 
machines, and what it actually sends depends on what calls are made; 
some information seeking requests will cause flushing of buffers and 
lower performance, whereas otherwise it can be allowed to throw out some 
values from unused events, if a series of events do not require the 
intermediate events. I doubt it matters that OpenGL is involved, except 
that there might be an X extension involved. Mostly I would say it is up 
to X protocols.

Knowing more about what you want to accomplish could help. The most 
common failure I've seen from just playing with it is that sometimes 
people try to use the X Shared Memory mechanism, and do not offer a way 
to turn it off...there is an underlying assumption in such code that the 
app is always running and displaying on the same machine (not a bad 
assumption if it is Win32 or Mac code that got ported to Linux/X11).

D. Stimits, stimits AT attbi.com

> thanks in advance again.. :)
> rgds,
> kh
> At 2002/09/16 11:46, you wrote:
>>Chan Kar Heng wrote:
>>>would anyone know of a good assert library??
>>>i'm particularly looking for one that dumps the function call stack...
>>>ansi assert merely reports the function that broke down.. but not
>>>the caller.. :(
>>>thanks in advance
>>>Web Page:  http://lug.boulder.co.us
>>>Mailing List: http://lists.lug.boulder.co.us/mailman/listinfo/lug
>>>Join us on IRC: lug.boulder.co.us port=6667 channel=#colug
>>I use this in some of my testing code (don't forget the -rdynamic):
>>#include <execinfo.h>
>>#include <iostream>
>>#ifdef _EXECINFO_H
>>void show_stackframe()
>>       void* trace[ 64 ];
>>       char** messages = NULL;
>>       int trace_size = 0;
>>       cerr << "Begin Stack Frame Dump" << endl;
>>       cerr << "(if useful symbols are not found, try recompiling "
>>               << "with -rdynamic during link, and -g without -O#)"
>>               << endl;
>>       trace_size = backtrace( trace, 64 );
>>       messages = backtrace_symbols( trace, trace_size );
>>       for( int i = 0; i < trace_size; ++i ) {
>>               cerr << "Traced: " << messages[i] << endl;
>>       }
>>       cerr << "End Stack Frame Dump" << endl;
>>#endif // _EXECINFO_H
> _______________________________________________
> Web Page:  http://lug.boulder.co.us
> Mailing List: http://lists.lug.boulder.co.us/mailman/listinfo/lug
> Join us on IRC: lug.boulder.co.us port=6667 channel=#colug

More information about the LUG mailing list