in reply to Re: stack trace from thread exit
in thread stack trace from thread exit
So, ig, you’re saying that you find core-dumps to be a useful diagnostic technique with regard to Perl programs? Interesting... Could you elaborate on (or reference to) how you use them in this context?
| Replies are listed 'Best First'. | |
|---|---|
|
Re^3: stack trace from thread exit
by ig (Vicar) on Oct 26, 2010 at 00:59 UTC | |
Could you elaborate on (or reference to) how you use them in this context? I am not sure which context you refer to by this context. With regard to Perl programs in general, I have rarely used gdb and, even less often, core dumps: to investigate perl initialization, lexing and parsing, to study and customize the regular expression engine and once to track down a bug in PerlIO that produced a core dump during initialization when attempting to read a UTF-16 encoded file. I don't recall any other use at the moment... Much more often, I use logging and test cases to investigate Perl programs and programs in general. I developed my debugging habits about the time Brian Kernighan wrote: The most effective debugging tool is still careful thought, coupled with judiciously placed print statements., and I remain very much in that camp. But there have been times when I have found debuggers and core dumps very helpful. For example, I once found a bug in the perl tokenizer that could not be isolated with test Perl programs and print statements, and tracing the execution was much more effective that merely reading the source in toke.c. I haven't done much with XS, but once outside the realm of the Perl interpreter gdb can be a helpful tool. When I do use them with Perl programs (gdb and core dumps) I do so as I would for any other program. There are various manuals and tutorials available on the net, including http://www.gnu.org/software/gdb/documentation/ and http://www.cs.cmu.edu/~gilpin/tutorial/. I always build perl from source with -g flag and generally investigate the issue by other means first. While it is possible to attach gdb to live programs, I very much prefer small test cases run in isolation. If by this context you mean the situation of the OP, I have not used gdb or core dumps to investigate crashing threaded Perl programs using possibly buggy XS modules. I would try other means to isolate the fault first, but might use gdb if core files were being produced, at least to get some idea where in the code the fault was occuring, if other approaches proved unsatisfactory. I was merely responding to the OP who said: I'd like to trap the fault in gdb. Given that specific objective and the warning, I thought a core dump produced in the context of the warning might be what the OP was wanting. The test program I provided produces a core dump, if resource limits permit (I am assuming *nix system). It is easily accessed in gdb with:
(Substitute the path to the relevant instance of perl on your system.) The C stack is easily displayed with the bt command. Beyond that, one would have to know perl and the relevant Perl and XS programs in some detail to know where to look. | [reply] [d/l] [select] |
by falan95054 (Novice) on Oct 26, 2010 at 21:04 UTC | |
I think perhaps my hacks to sigaction() were useful and/or there must be other options. As this is not indicating XSUBs code, I'll try 'perl -d' first. | [reply] [d/l] |
by BrowserUk (Patriarch) on Oct 27, 2010 at 08:01 UTC | |
In general, the simplest way to debug thread subs, is to do so by getting them right outside of threads first. Ie. Call them as a standard subroutines until they perform correctly. Occasionally, you will encounter a bug that only shows up inside a thread, but thanks to the iThreads model, that is remarkably rare. On those rare occasions when this has happened to me--invariably when calling Inline::C or XS code inside the thread--I've usually found that the problem doesn't happen if I run that code in a single thread at a time. Whether that thread be the main thread, or some other. And that invariable means that some dynamic library called from the XS routines I am calling, is inherently not thread safe and cannot be fixed without having the source available. The typical scenario for this kind of error, is when the dll/so stores per-client state internally, using the process id as an index into a static data area. Hence, when called from two (or more) threads of the same process, it tries to re-use the same memory for two concurrent clients with inevitable results. Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
| [reply] |
by ig (Vicar) on Oct 27, 2010 at 03:49 UTC | |
Interesting that your first stack trace had a frame for XS_Net__SSH2__new and this one doesn't... By the time the warning that a thread terminated abnormally is issued, the tread that terminated abnormally is already terminated - it won't show up in the stack trace to the warning. Here is another test program that demonstrates how to produce Perl stack trace if a thread dies and in output generally. These might be useful in case you can't duplicate the failure while running under the debugger. This also shows that a fatal signal is inconsistent with the failure you are seeing (i.e. your process continues to execute after the thread terminates). This limits the possibilities somewhat.
Output is:
Running gdb on the core file yields the following backtrace:
| [reply] [d/l] [select] |
|
Re^3: stack trace from thread exit
by falan95054 (Novice) on Oct 25, 2010 at 23:36 UTC | |
I'm not sure what to make of it yet. | [reply] [d/l] |
by ig (Vicar) on Oct 26, 2010 at 01:37 UTC | |
If you compile perl and your XS code with -g flag, gdb will be able to show you more information, including where and in which file each frame in the stack relates to. See Building a debugging perl in the INSTALL file that comes with the perl source for guidance on how to do this for perl. This will make it easier to understand, but nothing will make it easy - between perl, XS, SSH and threads, you have quite a complicated situation. | [reply] |