On 4 Oct 2012, at 1:05 PM, Larry Baker wrote: > I am still puzzled, though, why uClinux is silent when a program is aborted > when it receives an unhandled fatal signal. Mainline Linux (really the > shell?) prints out a message like > >> [root@atompc sdk]# ./SIGILL >> Illegal instruction > > (SIGILL.c is the example program from http://en.wikipedia.org/wiki/SIGILL.) > After a reboot of uClinux, I get nothing > >> / # SIGILL > > I have to enable print-fatal-signals as before to see anything: > >> / # echo 1 >/proc/sys/kernel/print-fatal-signals >> / # SIGILL >> SIGILL/79: potentially unexpected fatal signal 4. >> >> >> Format 04 Vector: 002c PC: 4052e544 Status: 0000 Not tainted >> ORIG_D0: ffffffff D0: 4052e544 A2: 4052ff60 A1: 4052e4ec >> A0: 4052e544 D5: 4052e524 D4: 00000000 >> D3: 00000000 D2: 00000001 D1: 0000002f >> USP: 4052ff04 > > Is this a uClinux thing? Or, a BusyBox (my uClinux shell) thing?
I'll answer my own question. It is the shell that prints out the "Illegal instruction" message. I found the code in bash that does that and added it to the BusyBox hush shell. The SDK I use has a rather old BusyBox, 1.13.3. The hush shell is in busybox-1.13.3/shell/hush.c. checkjobs() waits for all child processes -- there is no distinction made between job control jobs and non-job control jobs like there is in bash. There is already code there that can be (hand) enabled to be verbose about what happens to a job. Enabling that also makes hush very chatty. So, I added an #else clause for the #if DEBUG_JOBS conditional code in checkjobs() to mimic bash's behavior. Here's the patch for busybox-1.13.3: --- busybox-1.13.3/shell/hush.c +++ busybox-1.13.3-patched/shell/hush.c @@ -1720,2 +1720,13 @@ childpid, WEXITSTATUS(status)); > +#else > + if ((WIFSTOPPED (status) == 0) && WIFSIGNALED (status)) { > + int sig = WTERMSIG (status); > + if ((sig != SIGINT) && (sig != SIGPIPE)) { > + char *s = strsignal (sig); > + if ( s != NULL ) > + fprintf (stderr, "%s\n", s); > + else > + fprintf (stderr, "Unknown signal: > %d\n", sig); > + } > + } > #endif With this patched hush, I get what I am used to seeing: > / # trap > Illegal instruction > / # SIGILL > Illegal instruction Now I can go back and find out where the applications I use are failing. I suspect stack overflows, which my implementation of gcc -stack-check-symbol=__stack_start for non-68020 (e.g., ColdFire) processors can catch now. Larry Baker US Geological Survey 650-329-5608 ba...@usgs.gov
_______________________________________________ uClinux-dev mailing list uClinux-dev@uclinux.org http://mailman.uclinux.org/mailman/listinfo/uclinux-dev This message was resent by uclinux-dev@uclinux.org To unsubscribe see: http://mailman.uclinux.org/mailman/options/uclinux-dev