"DG" == Daniel Glassey writes:

 >> here's a backtrace from the non-stripped binary:

 DG> Thanks. Looks as though it in something happening within the
 DG> sword library. I haven't got Debian amd64 but I've rebuilt the
 DG> packages for Ubuntu edgy amd64 and haven't been able to replicate
 DG> the crash.

 DG> What modules (texts, commentaries etc) do you have installed.

 DG> Also, could you send your ~/.kde/share/config/bibletimerc

i did some more debugging: i've built the libsword6 package without
optimization, and re-built bibletime, statically linked to libsword.a

i have the KJV module installed in my ~/.sword directory, as well as
the sword-text-kjv package. if you will do the same, you hopefully
should be able to reproduce the problem. it doesn't appear to be amd64
specific.

the problematic code, where the crash occurs, is in
sword-1.5.9/src/mgr/swmgr.cpp, in function SWMgr::augmentModules:

607:            if (multiMod) {
608:                    // fix config's Section names to rename modules which 
are available more than once
609:                    // find out which sections are in both config objects
610:                    // inserting all configs first is not good because that 
overwrites old keys and new modules would share the same config
611:                    for (SectionMap::iterator it = 
config->Sections.begin(); it != config->Sections.end(); ++it) {
612:                            if (saveConfig->Sections.find( (*it).first ) != 
saveConfig->Sections.end()) { //if the new section is already present rename it
613:                                    ConfigEntMap entMap((*it).second);
614:
615:                                    SWBuf name;
616:                                    int i = 1;
617:                                    do { //module name already used?
618:                                            name.setFormatted("%s_%d", 
(*it).first.c_str(), i);
619:                                            i++;
620:                                    } while (config->Sections.find(name) != 
config->Sections.end());
621:
622:                                    
config->Sections.insert(SectionMap::value_type(name, entMap) );
623:                                    config->Sections.erase(it);
624:                            }
625:                    }
626:            }

(i've inserted line numbers for convenience).

since i have two KJV modules (one coming from the debian package, and
one installed in my ~/.sword directory), and multiMod passed to
augmentModules is true, this code gets executed.

here's how i see the crash in gdb:

=======================================================================
(gdb) br swmgr.cpp:623
Breakpoint 1 at 0x54c202: file ../src/mgr/swmgr.cpp, line 623.
(gdb) r
Starting program: 
/home/vvv/src/bibletime/bibletime/bibletime-1.6.2.dfsg/build-tree/bibletime-1.6.2.dfsg/bibletime/bibletime
[Thread debugging using libthread_db enabled]
[New Thread 47596797739536 (LWP 26511)]
kbuildsycoca running...
DCOP Cleaning up dead connections.
[Switching to Thread 47596797739536 (LWP 26511)]

Breakpoint 1, sword::SWMgr::augmentModules (this=0x1210d30,
    ipath=0x1018e30 "/home/vvv/.sword/", multiMod=true) at 
../src/mgr/swmgr.cpp:623
623                                             config->Sections.erase(it);
(gdb) n
611                             for (SectionMap::iterator it = 
config->Sections.begin(); it != config->Sections.end(); ++it) {
(gdb) n
612                                     if (saveConfig->Sections.find( 
(*it).first ) != saveConfig->Sections.end()) { //if the new section is already 
present rename it
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x00002b49fdd8efd2 in strcmp () from /lib/libc.so.6
=======================================================================

the crash occurs on the line 612, because the statement on the line
623 apparently makes (*it) invalid. i've put more verbose gdb output
below, where i printed the value of *it on each of the steps.

i was apparently able to work-around the bug by entering "print it++"
in gdb when a breakpoint 623 is reached. continuing after that, i get
bibletime run without a crash. i also have other duplicated modules
installed, such as the StrongsGreek (in both ~/.sword and via the
sword-dict-strongs-greek package), but apparently only the first time
when line 623 gets executed causes garbage in *it - i don't have to
run "print it++" to avoid a crash for other duplicated modules.

Best,
v.

=======================================================================
(gdb) br swmgr.cpp:623
Breakpoint 1 at 0x54c202: file ../src/mgr/swmgr.cpp, line 623.
(gdb) r
Starting program: 
/home/vvv/src/bibletime/bibletime/bibletime-1.6.2.dfsg/build-tree/bibletime-1.6.2.dfsg/bibletime/bibletime
[Thread debugging using libthread_db enabled]
[New Thread 47292642247184 (LWP 26484)]
kbuildsycoca running...
[Switching to Thread 47292642247184 (LWP 26484)]

Breakpoint 1, sword::SWMgr::augmentModules (this=0x1210d30,
    ipath=0x1018e30 "/home/vvv/.sword/", multiMod=true)
    at ../src/mgr/swmgr.cpp:623
623                                             config->Sections.erase(it);
(gdb) print *it
$1 = (
    class std::pair<const sword::SWBuf,sword::multimapwithdefault<sword::SWBuf, 
sword::SWBuf, std::less<sword::SWBuf> > > &) @0x13cd3a0: {first = {
    buf = 0x13ccfa0 "KJV", end = 0x13ccfa3 "", endAlloc = 0x13cd023 "\001",
    fillByte = 32 ' ', allocSize = 132, static nullStr = 0x5eae25 "",
    static junkBuf = 
"KJV_1\000hare/sword/modules/texts/rawtext/web/nt\000vss\000zv\000strongshebrew.dat",
 '\0' <repeats 8120 times>},
  second = 
{<std::multimap<sword::SWBuf,sword::SWBuf,std::less<sword::SWBuf>,std::allocator<std::pair<const
 sword::SWBuf, sword::SWBuf> > >> = {_M_t = {
        _M_impl = {<std::allocator<std::_Rb_tree_node<std::pair<const 
sword::SWBuf, sword::SWBuf> > >> = 
{<__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<const sword::SWBuf, 
sword::SWBuf> > >> = {<No data fields>}, <No data fields>}, _M_key_compare = 
{<> = {<No data fields>}, <No data fields>},
          _M_header = {_M_color = std::_S_red, _M_parent = 0x13c6a30,
            _M_left = 0x13c98f0, _M_right = 0x13c8ae0},
          _M_node_count = 27}}}, <No data fields>}}
(gdb) n
611                             for (SectionMap::iterator it = 
config->Sections.begin(); it != config->Sections.end(); ++it) {
(gdb) print *it
$2 = (
    class std::pair<const sword::SWBuf,sword::multimapwithdefault<sword::SWBuf, 
sword::SWBuf, std::less<sword::SWBuf> > > &) @0x13cd3a0: {first = {
    buf = 0x13ccfa0 "`\230<\001", end = 0x13ccfa3 "\001",
    endAlloc = 0x13cd023 "\001", fillByte = 32 ' ', allocSize = 132,
    static nullStr = 0x5eae25 "",
    static junkBuf = 
"KJV_1\000hare/sword/modules/texts/rawtext/web/nt\000vss\000zv\000strongshebrew.dat",
 '\0' <repeats 8120 times>},
  second = 
{<std::multimap<sword::SWBuf,sword::SWBuf,std::less<sword::SWBuf>,std::allocator<std::pair<const
 sword::SWBuf, sword::SWBuf> > >> = {_M_t = {
        _M_impl = {<std::allocator<std::_Rb_tree_node<std::pair<const 
sword::SWBuf, sword::SWBuf> > >> = 
{<__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<const sword::SWBuf, 
sword::SWBuf> > >> = {<No data fields>}, <No data fields>}, _M_key_compare = 
{<> = {<No data fields>}, <No data fields>},
          _M_header = {_M_color = std::_S_red, _M_parent = 0x13c6a30,
            _M_left = 0x13c98f0, _M_right = 0x13c8ae0},
          _M_node_count = 27}}}, <No data fields>}}
(gdb) n
612                                     if (saveConfig->Sections.find( 
(*it).first ) != saveConfig->Sections.end()) { //if the new section is already 
present rename it
(gdb) print *it
$3 = (
    class std::pair<const sword::SWBuf,sword::multimapwithdefault<sword::SWBuf, 
sword::SWBuf, std::less<sword::SWBuf> > > &) @0xc33140: {first = {
    buf = 0x6e6f <Address 0x6e6f out of bounds>,
    end = 0x5d0 <Address 0x5d0 out of bounds>,
    endAlloc = 0x5d0 <Address 0x5d0 out of bounds>, fillByte = 0 '\0',
    allocSize = 0, static nullStr = 0x5eae25 "",
    static junkBuf = 
"KJV_1\000hare/sword/modules/texts/rawtext/web/nt\000vss\000zv\000strongshebrew.dat",
 '\0' <repeats 8120 times>},
  second = 
{<std::multimap<sword::SWBuf,sword::SWBuf,std::less<sword::SWBuf>,std::allocator<std::pair<const
 sword::SWBuf, sword::SWBuf> > >> = {_M_t = {
        _M_impl = {<std::allocator<std::_Rb_tree_node<std::pair<const 
sword::SWBuf, sword::SWBuf> > >> = 
{<__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<const sword::SWBuf, 
sword::SWBuf> > >> = {<No data fields>}, <No data fields>}, _M_key_compare = 
{<> = {<No data fields>}, <No data fields>},
          _M_header = {_M_color = 4, _M_parent = 0x2e000018,
            _M_left = 0x2806e2b3, _M_right = 0x6},
          _M_node_count = 198340247576}}}, <No data fields>}}
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x00002b032cc46fd2 in strcmp () from /lib/libc.so.6
=======================================================================


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to