kral@skvax1.csc.ti.COM (10/07/88)
I recently got a Sun 4/110. I was previously working on a Sun 3/60.
I moved my X application over from the Sun3 to the Sun4, recompiled and I get
a BUS error. Using dbx it seems as if it's a problem with Xt source. In
particular, the Convert.c file in lib/Xt, routine XtDirectConvert(). I had
thought I was calling something wrong but it turns out that on the MIT
distribution tape the examples/xwidgets comes up with the same error. Anyways,
I can't find the solution to my problem. Could someone please look at the
dbx outputs below and see if they can help me? Maybe this has happened to
others and there is an easy solution (I wish).
In the main program of my application the program bombs on the
call on line 602:
595 XtSetArg( where[0], XtNlabel, "Filename: ");
596 XtSetArg( where[1], XtNvalue, "");
597 XtSetArg( where[2], XtNborderWidth, 0);
598 XtSetArg( where[3], XtNfromHoriz, pfdisk);
599 XtSetArg( where[4], XtNhorizDistance, 15);
600 XtSetArg( where[5], XtNfromVert, pfdial1);
601 /* works exit(0); */
602 pfdial2 = XtCreateManagedWidget(NULL, dialogWidgetClass,
603 pfform, where, SIX);
604
605 /* doesn't exit(0); */
Using dbx I get this error:
Running: symbol2
signal BUS (bus error) in XtDirectConvert at line 270 in file "Convert.c"
270 && (p->num_args == num_args)) {
Here is what the source for XtDirectConvert in lib/Xt/Convert.c looks like:
250 void XtDirectConvert(converter, args, num_args, from, to)
251 XtConverter converter;
252 XrmValuePtr args;
253 Cardinal num_args;
254 register XrmValuePtr from;
255 XrmValuePtr to;
256 {
257 register CachePtr p;
258 register int hash;
259 register Cardinal i;
260
261 /* Try to find cache entry for conversion */
262 hash = ((int)(converter) >> 2) + from->size + *((char *) from->addr);
263 if (from->size > 1) hash += ((char *) from->addr)[1];
264
265 for (p = cacheHashTable[hash & CACHEHASHMASK]; p != NULL; p = p->next)
{
266 if ((p->hash == hash)
267 && (p->converter == converter)
268 && (p->from.size == from->size)
269 && (! XtBCmp(p->from.addr, from->addr, from->size))
270 && (p->num_args == num_args)) {
271 /* Are all args the same data ? */
272 for (i = 0; i < num_args; i++) {
273 if ( p->args[i].size != args[i].size
274 || XtBCmp(p->args[i].addr, args[i].addr, args[i].size))
{
275 break;
276 }
277 }
278 if (i == num_args) {
279 /* Perfect match */
280 (*to) = p->to;
281 return;
282 }
283 }
284 }
285
286 /* Didn't find it, call converter procedure and entry result in cache *
/
287 (*to).size = 0;
288 (*to).addr = NULL;
289 (*converter)(args, &num_args, from, to);
290 CacheEnter(converter, args, num_args, from, to, hash);
291 }
The calls to XtDirectConvert after the XtCreateManagedWidget() in line 602
of my application program are listed below:
Using display variables in dbx this is what the variables of
the 'if' statement look like just before crashing:
(dbx) cont
`Convert`XtDirectConvert`p->hash = 37455
`Convert`XtDirectConvert`hash = 37455
`Convert`XtDirectConvert`p->converter = &CvtDefaultColorToPixel() at 0x2492c
`Convert`XtDirectConvert`converter = &CvtDefaultColorToPixel() at 0x2492c
`Convert`XtDirectConvert`p->from.size = 4
`Convert`XtDirectConvert`from->size = 149804
`Convert`XtDirectConvert`p->num_args = 1
`Convert`XtDirectConvert`num_args = 1
(dbx) cont
`Convert`XtDirectConvert`p->hash = 37455
`Convert`XtDirectConvert`hash = 37455
`Convert`XtDirectConvert`p->converter = &CvtDefaultColorToPixel() at 0x2492c
`Convert`XtDirectConvert`converter = &CvtDefaultColorToPixel() at 0x2492c
`Convert`XtDirectConvert`p->from.size = 4
`Convert`XtDirectConvert`from->size = 149804
`Convert`XtDirectConvert`p->num_args = 1
`Convert`XtDirectConvert`num_args = 1
(dbx) cont
`Convert`XtDirectConvert`p->hash = 37457
`Convert`XtDirectConvert`hash = 37457
`Convert`XtDirectConvert`p->converter = &CvtStringToInt() at 0x24798
`Convert`XtDirectConvert`converter = &CvtStringToInt() at 0x24798
`Convert`XtDirectConvert`p->from.size = 4
`Convert`XtDirectConvert`from->size = 149400
`Convert`XtDirectConvert`p->num_args = 0
`Convert`XtDirectConvert`num_args = 0
(dbx) cont
signal BUS (bus error) in XtDirectConvert at line 270 in file "Convert.c"
270 && (p->num_args == num_args)) {
=======================================================
Same problem with examples/xwidgets.c:
Line 142 in main() of xwidgets.c is the call which blows up:
135 label = XtCreateManagedWidget( "label", labelWidgetClass,
136 box1, NULL, ZERO );
137 button = XtCreateManagedWidget( "command", commandWidgetClass,
138 box1, NULL, ZERO );
139 XtAddCallback( button, XtNcallback, Count, (caddr_t)label );
140
141 XtSetArg( arg[0], XtNmin, 16 );
142 XtCreateManagedWidget( NULL, clockWidgetClass, outer, arg, ONE );
143
144 XtCreateManagedWidget( NULL, loadWidgetClass, outer, NULL, ZERO );
145
dbx output when stepping into line 142 and stopping at 270 of XtDirectConvert
looks like:
(dbx)cont
`Convert`XtDirectConvert`p->hash = 27117
`Convert`XtDirectConvert`hash = 27117
`Convert`XtDirectConvert`p->converter = &CvtDefaultColorToPixel() at 0x1a7a4
`Convert`XtDirectConvert`converter = &CvtDefaultColorToPixel() at 0x1a7a4
`Convert`XtDirectConvert`p->from.size = 4
`Convert`XtDirectConvert`from->size = 108452
`Convert`XtDirectConvert`p->num_args = 1
`Convert`XtDirectConvert`num_args = 1
`Convert`XtDirectConvert`p->hash = 27117
`Convert`XtDirectConvert`hash = 27117
`Convert`XtDirectConvert`p->converter = &CvtDefaultColorToPixel() at 0x1a7a4
`Convert`XtDirectConvert`converter = &CvtDefaultColorToPixel() at 0x1a7a4
`Convert`XtDirectConvert`p->from.size = 4
`Convert`XtDirectConvert`from->size = 108452
`Convert`XtDirectConvert`p->num_args = 1
`Convert`XtDirectConvert`num_args = 1
`Convert`XtDirectConvert`p->hash = 27119
`Convert`XtDirectConvert`hash = 27119
`Convert`XtDirectConvert`p->converter = &CvtStringToInt() at 0x1a610
`Convert`XtDirectConvert`converter = &CvtStringToInt() at 0x1a610
`Convert`XtDirectConvert`p->from.size = 4
`Convert`XtDirectConvert`from->size = 108048
`Convert`XtDirectConvert`p->num_args = 0
`Convert`XtDirectConvert`num_args = 0
(dbx) cont
signal BUS (bus error) in XtDirectConvert at line 270 in file "Convert.c"
===================================
266 if ((p->hash == hash)
267 && (p->converter == converter)
268 && (p->from.size == from->size)
269 && (! XtBCmp(p->from.addr, from->addr, from->size))
270 && (p->num_args == num_args)) {
271 /* Are all args the same data ? */
272 for (i = 0; i < num_args; i++) {
273 if ( p->args[i].size != args[i].size
The only other puzzling thing to me is on line 269 of the 'if'
statement in XtDirectConvert, what is XtBCmp()? Is it a macro? If it is a
module, function, or procedure I can't find it.
If someone can help solve this I would greatly appreciate it. Thanks.
Kral Ferch
Texas Instruments
kral@skvax1.ti.com
-------------------
Kral Ferch Texas Instruments, Inc.
ARPANET: kral@skvax1.ti.comjim@expo.lcs.mit.EDU (Jim Fulton) (10/07/88)
The problem probably arised from the XtBCopy, XtBZero, and XtBCmp macros in lib/Xt/IntrinsicI.h. If you change them as follows, things should work much better (i.e. I chased this same problem down with someone else): *** R2/IntrinsicI.h Fri Feb 26 12:41:24 1988 --- IntrinsicI.h Fri Oct 7 11:27:14 1988 *************** *** 40,67 **** extern void bcopy(); #define XtBCopy(src, dst, size) \ ! if (size == sizeof(int) && \ ! !((unsigned int) src & 0x3) && \ ! !((unsigned int) dst & 0x3)) \ ! *((int *) (dst)) = *((int *) (src)); \ ! else if (size == sizeof(char)) \ ! *((char *) (dst)) = *((char *) (src)); \ ! else \ ! bcopy((char *) (src), (char *) (dst), (int) (size)); extern void bzero(); #define XtBZero(dst, size) \ ! if (size == sizeof(int)) \ ! *((int *) (dst)) = 0; \ ! else \ ! bzero((char *) (dst), (int) (size)); extern int bcmp(); #define XtBCmp(b1, b2, size) \ ! (size == sizeof(int) ? \ ! *((int *) (b1)) != *((int *) (b2)) \ ! : bcmp((char *) (b1), (char *) (b2), (int) (size)) \ ! ) --- 40,54 ---- extern void bcopy(); #define XtBCopy(src, dst, size) \ ! bcopy((char *) (src), (char *) (dst), (int) (size)) extern void bzero(); #define XtBZero(dst, size) \ ! bzero((char *) (dst), (int) (size)) extern int bcmp(); #define XtBCmp(b1, b2, size) \ ! bcmp((char *) (b1), (char *) (b2), (int) (size))