TkTreeCtrl 2.4.1 *sometimes* crashes with a SIGBUS in TreeItem_CreateHeader() at generic/tkTreeItem.c:10130. Environment is a HP-UX 11i v3 (11.31) ia64. It was compiled against Tcl/Tk 8.5.11 with HP C/aC++ B3910B A.06.25 [Nov 30 2009].
GDB ouput:
Program terminated with signal 10, Bus error.
BUS_ADRALN - Invalid address alignment. Please refer to the following link that helps in handling unaligned data: http://docs.hp.com/en/7730/newhelp0610/pragmas.htm#pragma-pack-ex3
#0 0x40000000001ee5a0:1 in TreeItem_CreateHeader (tree=0x6000000000e01300)
at /.../tktreectrl/generic/tkTreeItem.c:10130
(gdb) bt 3
#0 0x40000000001ee5a0:1 in TreeItem_CreateHeader (tree=0x6000000000e01300)
at /.../tktreectrl/generic/tkTreeItem.c:10130
#1 0x40000000001c0610:0 in TreeHeader_InitWidget (tree=0x6000000000e01300)
at /.../tktreectrl/generic/tkTreeHeader.c:3283
#2 0x4000000000152ce0:0 in TreeObjCmd (clientData=0x0,
interp=0x600000000005ddf0, objc=2, objv=0x6000000000073230)
at /.../tktreectrl/generic/tkTreeCtrl.c:489
(More stack frames follow...)
(gdb) print item
$1 = 0x6000000000e025ec
(gdb) print *item
$2 = {id = 0, depth = 0, fixedHeight = 0, numChildren = 0, index = 0,
indexVis = -1, state = 0, parent = 0x0, firstChild = 0x0, lastChild = 0x0,
prevSibling = 0x0, nextSibling = 0x0, dInfo = 0x0, rInfo = 0x0,
columns = 0x0, spans = 0x0, spanAlloc = 0, flags = 34, tagInfo = 0x0,
header = 0x0}
(gdb) print header
$3 = 0x6000000000e046f0
(gdb) print *header
$4 = {tree = 0x6000000000e01300, item = 0x6000000000e025ec, columnDrag = {
enable = 1, draw = 1}}
(gdb) print &item->header
$6 = (struct TreeHeader_ **) 0x6000000000e02664
(gdb) disas $pc-16*8 $pc+15*4
Dump of assembler code from 0x40000000001ee520:0 to 0x40000000001ee5d0:0:
;;; File: /.../tktreectrl/generic/tkTreeItem.c
;;; Line: 10122
0x40000000001ee520:0 <TreeItem_CreateHeader>:
alloc r38=ar.pfs,0,8,4,0 MMI
0x40000000001ee520:1 <TreeItem_CreateHeader+0x1>:
nop.m 0x0
0x40000000001ee520:2 <TreeItem_CreateHeader+0x2>:
mov r39=rp
0x40000000001ee530:0 <TreeItem_CreateHeader+0x10>:
mov r37=gp MMI,
0x40000000001ee530:1 <TreeItem_CreateHeader+0x11>:
mov r33=r32
;;; Line: 10126
0x40000000001ee530:2 <TreeItem_CreateHeader+0x12>:
mov r41=1;;
0x40000000001ee540:0 <TreeItem_CreateHeader+0x20>:
mov r40=r33 MMB,
0x40000000001ee540:1 <TreeItem_CreateHeader+0x21>:
nop.m 0x0
0x40000000001ee540:2 <TreeItem_CreateHeader+0x22>:
br.call.dptk.many rp=Item_Alloc+0x0;;
0x40000000001ee550:0 <TreeItem_CreateHeader+0x30>:
mov r34=ret0 MI,I
;;; Line: 10127
0x40000000001ee550:1 <TreeItem_CreateHeader+0x31>:
mov r40=r33;;
0x40000000001ee550:2 <TreeItem_CreateHeader+0x32>:
mov r41=r34
0x40000000001ee560:0 <TreeItem_CreateHeader+0x40>:
nop.m 0x0 MMB,
0x40000000001ee560:1 <TreeItem_CreateHeader+0x41>:
nop.m 0x0
0x40000000001ee560:2 <TreeItem_CreateHeader+0x42>:
br.call.dptk.many rp=TreeHeader_CreateWithItem+0x0;;
0x40000000001ee570:0 <TreeItem_CreateHeader+0x50>:
mov gp=r37 MI,I
0x40000000001ee570:1 <TreeItem_CreateHeader+0x51>:
mov r36=ret0;;
;;; Line: 10128
0x40000000001ee570:2 <TreeItem_CreateHeader+0x52>:
cmp.ne p6=r0,r36
0x40000000001ee580:0 <TreeItem_CreateHeader+0x60>:
nop.m 0x0 MMB,
0x40000000001ee580:1 <TreeItem_CreateHeader+0x61>:
nop.m 0x0
0x40000000001ee580:2 <TreeItem_CreateHeader+0x62>:
(p6) br.cond.dptk.many TreeItem_CreateHeader+0x80;;
0x40000000001ee590:0 <TreeItem_CreateHeader+0x70>:
nop.m 0x0 MMB,
0x40000000001ee590:1 <TreeItem_CreateHeader+0x71>:
nop.m 0x0
0x40000000001ee590:2 <TreeItem_CreateHeader+0x72>:
br.cond.dptk.many TreeItem_CreateHeader+0x80;;
;;; Line: 10130
0x40000000001ee5a0:0 <TreeItem_CreateHeader+0x80>:
adds ret1=120,r34;; M,MI
0x40000000001ee5a0:1 <TreeItem_CreateHeader+0x81>:
st8 [ret1]=r36
;;; Line: 10133
0x40000000001ee5a0:2 <TreeItem_CreateHeader+0x82>:
adds ret1=0x3e0,r33
0x40000000001ee5b0:0 <TreeItem_CreateHeader+0x90>:
mov r43=0 MMI,
0x40000000001ee5b0:1 <TreeItem_CreateHeader+0x91>:
mov r40=r33
0x40000000001ee5b0:2 <TreeItem_CreateHeader+0x92>:
mov r41=r34;;
0x40000000001ee5c0:0 <TreeItem_CreateHeader+0xa0>:
ld4 r42=[ret1] MMB,
0x40000000001ee5c0:1 <TreeItem_CreateHeader+0xa1>:
nop.m 0x0
0x40000000001ee5c0:2 <TreeItem_CreateHeader+0xa2>:
br.call.dptk.many rp=Item_CreateColumn+0x0;;
End of assembler dump.
I am just guessing, but the pointer of item + the offset of item->header / 8 is not at 8 byte boundary (is this correct?):
% expr {(0x6000000000e025ec + 120) / 8.0}
8.646911284569715e+17
-- Matthias
It seems the allocator implemented by treectrl isn't going to work on that platform.
It may just require that the TreeItem be 16-byte-aligned rather than 8 as it is now,
but I'm not sure.
Can you comment out line 72 in tkTreeCtrl.h and see if that fixes the problem?
/* #define ALLOC_HAX */
I guessed this was the result of new structs introduced with the header code exposing a bug in the memory allocator. I revised the memory allocator based on the newer Tcl allocator in TclAlloc.c. Hopefully this fixes the issue.
Is the fix in an already released version?
I am asking, because I am using 2.4.1 right now and just got a core dump from a SIGBUS sent in which happened on a Solaris 11.1 system. I haven't had the chance to look deeper into it, but the first few lines of the stack trace suggest it is crashing at the same location.
Could you try this release candidate for 2.4.2? I contains a possible fix for this issue.
https://dl.dropbox.com/u/13095836/tktreectrl-2.4.2.tar.gz