[Kde-bindings] debugging a korundum program after a crash
Richard Dale
rdale at foton.es
Tue Apr 14 17:22:35 UTC 2009
On Tuesday 31 March 2009 09:52:02 Stefano Crocco wrote:
> Alle Monday 30 March 2009, Richard Dale ha scritto:
> > On Monday 30 March 2009 10:38:57 Stefano Crocco wrote:
> > > My korundum4 program is randomly crashing. By 'crashing', I don't mean
> > > it's raising an exception which isn't caught, but that it's crashing at
> > > the C++ level. This could mean I just found a bug in qtruby or korundum
> > > but it's much more likely that it simply means my program is doing
> > > something it shouldn't.
> > >
> > > If my program raised an exception, I could simply look at the line
> > > where the exception was raised and from there follow the program flow
> > > and try to understand what's wrong. Of course, with a C++-level crash,
> > > I can't do that, since the backtrace only contains calls to
> > > qt/kde/smoke/qtruby/ruby internal functions.
> > >
> > > Do you have any advice on how to proceed?
> >
> > Post the C++ backtrace on the mailing list in case that gives a clue
> > about the cause. Try to make the smallest program that is possible that
> > reproduces the crash. Does it still crash if you turn off garbage
> > collection with 'GC.disable'?
>
> Thanks for your answer. I tried disabling garbage collection, but the
> errors persisted. As for making the smallest program that reproduces the
> crash, this is going to be difficult, for two reasons: first, the crashes
> are random, so that the same operation sometimes works and sometimes
> crashes; second I think the bugs I see seem to be caused by the interaction
> among several pieces of my application, so I don't think I can make a
> smaller program. At any rate, I'll post the backtrace as soon as I get the
> crash again.
>
> However, I think I found a way to at least find out were the crash happens:
> since I know which actions can lead to a crash, I use set_trace_func just
> before those points, so that I can at least see where the crash happens.
>
> The first results haven't as yet given me any clue as to the cause of the
> crashes. However, I've found an exception being raised by the following
> code (simplified):
>
> class Document < Qt::Object
>
> def method_missing name, *args, &blk
> begin super
> rescue NoMethodError, NameError
> @doc.send name, *args, &blk
> end
> end
>
> ...
>
> end
>
> What I'm trying to do here is to create a wrapper around an instance of
> KTextEditor::Document (stored in @doc). The idea is that, if a method isn't
> defined in Document, it should forward it to @doc. Since I know that qtruby
> uses method_missing itself, I first called the Qt::Object implementation of
> method_missing and only if it fails I pass the method call to @doc. Do you
> known whether what I'm doing here is safe? I admit I don't like it at all,
> and I'd like to replace it with something else (most likely using the
> Forwardable module), but I've never done that because of the huge number of
> methods in KTextEditor::Document.
>
Yes I can't see anything wrong with using method_missing to divert method
calls. I do something similar in the Plasma Ruby bindings to forward calls
from the scripting applet code to the underlying c++ applet:
# If a method is called on a PlasmaScripting::Applet instance is found to
be missing
# then try calling the method on the underlying Plasma::Applet in the
ScriptEngine.
def method_missing(method, *args)
begin
super(method, *args)
rescue
applet_script.applet.method_missing(method, *args)
end
end
def self.const_missing(name)
begin
super(name)
rescue
Plasma::Applet.const_missing(name)
end
end
-- Richard
More information about the Kde-bindings
mailing list