As far as I'm aware, the unit tests do use the dynamic library.
Looking at the stacktrace, I would expect the '--version' argument to
not work, since it seems to be happening before main() - my suspicion
is that your code has another static initialization(unrelated to
log4cxx) someplace, that is messing with memory.

I'm not sure how much you know about the startup sequence, so here's a
quick overview.
When a C++ application starts up, it is going to run through all of
the static constructors.  Log4cxx has a lot of these in it.  So if
your code looks like this:

static log4cxx::Logger logger = log4cxx::LogManager::getLogger( "foo" );
int main(){
  return 0;
}

the constructor for 'logger' happens before main is run.  In this
particular case, it seems that the classnamepatternconverter is trying
to register with the Log4cxx core, so that log4cxx will know how to
load the class.  Perhaps it loads them in alphabetical order?

This SO post may provide some insight:
https://stackoverflow.com/questions/335369/finding-c-static-initialization-order-problems

-Robert Middleton

On Thu, Oct 28, 2021 at 7:18 AM Bob Kirnum <bkir...@gmail.com> wrote:
>
> Hey Robert,
>
> I agree that the socket issue is most likely unrelated.  I'll try to look
> at this.
>
> I just noticed that our application supports '--version' which simply
> prints the version and exits.  Even using this results in the same segfault
> so it seems the issue is more related to dynamic loading of the log4cxx
> library.  Anyway, below is the initialization our code has been using for a
> while now.  Have not seen such a crash until now using Monterey.  I see no
> reference to our code in the back trace, just the dynamic library loading.
> Do the unit tests also use the dynamic library?
>
> Thanks,
> Bob
>
> <<
> int main(int argc, char* argv[]) {
>   IGNORE_WARNINGS_ASIO;
>   if (2 == argc && 0 == strcmp("--version", argv[1])) {
>     printVersion();
>     return 0;
>   } else if (3 != argc) {
>     printUsage();
>     return 1;
>   }
>
>   std::string logging_property_file(argv[2]);
>
>   if (stringEndsWith(logging_property_file, ".xml")) {
>     log4cxx::xml::DOMConfigurator::configure(logging_property_file.c_str());
>   } else {
>     PropertyConfigurator::configure(logging_property_file.c_str());
>   }
> >>
>
> On Wed, Oct 27, 2021 at 4:15 PM Robert Middleton <rmiddle...@apache.org>
> wrote:
>
> > The 'socketservertestcase' is probably not related to the issue at
> > all, but I've said that before about plenty of things and been wrong,
> > so I would recommend that you look into the reason that's failing
> > first.  You may need to run the test manually in order to get more
> > useful output information. (maybe you don't have Java installed?)
> >
> > Otherwise since it looks like the crash is happening early in
> > startup(before main), my best guess is that there is something in your
> > code that is messing with the startup sequence - overwriting memory
> > someplace?  If it was a problem with log4cxx directly, I would expect
> > that all of the tests would fail with the same error.
> >
> > -Robert Middleton
> >
> > On Wed, Oct 27, 2021 at 2:38 PM Matt Sicker <boa...@gmail.com> wrote:
> > >
> > > Could this be a firewall configuration issue?
> > >
> > > Matt Sicker
> > >
> > > > On Oct 27, 2021, at 11:52, Bob Kirnum <bkir...@gmail.com> wrote:
> > > >
> > > > I am concerned that something may have changed on my system not
> > directly
> > > > related to the Monterey upgrade.  We normally just use the dynamic
> > library,
> > > > I only built it now in order to help debug the issue.  I was getting
> > the
> > > > same segmentation fault prior to building from source.
> > > >
> > > > Just ran the unit tests, all but one passes.
> > > >
> > > > make test
> > > > Running tests...
> > > > Test project /Users/bkirnum/Documents/GitHub/logging-log4cxx/build
> > > >      Start  1: asyncappendertestcase
> > > > 1/62 Test  #1: asyncappendertestcase ..................   Passed
> >  23.82
> > > > sec
> > > >      Start  2: consoleappendertestcase
> > > > 2/62 Test  #2: consoleappendertestcase ................   Passed
> > 0.08
> > > > sec
> > > >      Start  3: decodingtest
> > > > 3/62 Test  #3: decodingtest ...........................   Passed
> > 0.08
> > > > sec
> > > >      Start  4: encodingtest
> > > > 4/62 Test  #4: encodingtest ...........................   Passed
> > 0.08
> > > > sec
> > > >      Start  5: fileappendertest
> > > > 5/62 Test  #5: fileappendertest .......................   Passed
> > 0.08
> > > > sec
> > > >      Start  6: filetestcase
> > > > 6/62 Test  #6: filetestcase ...........................   Passed
> > 0.08
> > > > sec
> > > >      Start  7: hierarchytest
> > > > 7/62 Test  #7: hierarchytest ..........................   Passed
> > 0.07
> > > > sec
> > > >      Start  8: hierarchythresholdtestcase
> > > > 8/62 Test  #8: hierarchythresholdtestcase .............   Passed
> > 0.09
> > > > sec
> > > >      Start  9: jsonlayouttest
> > > > 9/62 Test  #9: jsonlayouttest .........................   Passed
> > 0.10
> > > > sec
> > > >      Start 10: l7dtestcase
> > > > 10/62 Test #10: l7dtestcase ............................   Passed
> > 0.08
> > > > sec
> > > >      Start 11: leveltestcase
> > > > 11/62 Test #11: leveltestcase ..........................   Passed
> > 0.07
> > > > sec
> > > >      Start 12: loggertestcase
> > > > 12/62 Test #12: loggertestcase .........................   Passed
> > 0.19
> > > > sec
> > > >      Start 13: mdctestcase
> > > > 13/62 Test #13: mdctestcase ............................   Passed
> > 0.08
> > > > sec
> > > >      Start 14: minimumtestcase
> > > > 14/62 Test #14: minimumtestcase ........................   Passed
> > 0.10
> > > > sec
> > > >      Start 15: ndctestcase
> > > > 15/62 Test #15: ndctestcase ............................   Passed
> > 0.08
> > > > sec
> > > >      Start 16: patternlayouttest
> > > > 16/62 Test #16: patternlayouttest ......................   Passed
> > 0.14
> > > > sec
> > > >      Start 17: propertyconfiguratortest
> > > > 17/62 Test #17: propertyconfiguratortest ...............   Passed
> > 0.28
> > > > sec
> > > >      Start 18: rollingfileappendertestcase
> > > > 18/62 Test #18: rollingfileappendertestcase ............   Passed
> > 0.10
> > > > sec
> > > >      Start 19: streamtestcase
> > > > 19/62 Test #19: streamtestcase .........................   Passed
> > 2.32
> > > > sec
> > > >      Start 20: multithreadtest
> > > > 20/62 Test #20: multithreadtest ........................   Passed
> > 0.26
> > > > sec
> > > >      Start 21: absolutetimedateformattestcase
> > > > 21/62 Test #21: absolutetimedateformattestcase .........   Passed
> > 0.07
> > > > sec
> > > >      Start 22: cacheddateformattestcase
> > > > 22/62 Test #22: cacheddateformattestcase ...............   Passed
> > 0.08
> > > > sec
> > > >      Start 23: casttestcase
> > > > 23/62 Test #23: casttestcase ...........................   Passed
> > 0.07
> > > > sec
> > > >      Start 24: charsetdecodertestcase
> > > > 24/62 Test #24: charsetdecodertestcase .................   Passed
> > 0.07
> > > > sec
> > > >      Start 25: charsetencodertestcase
> > > > 25/62 Test #25: charsetencodertestcase .................   Passed
> > 0.20
> > > > sec
> > > >      Start 26: cyclicbuffertestcase
> > > > 26/62 Test #26: cyclicbuffertestcase ...................   Passed
> > 0.12
> > > > sec
> > > >      Start 27: datetimedateformattestcase
> > > > 27/62 Test #27: datetimedateformattestcase .............   Passed
> > 0.16
> > > > sec
> > > >      Start 28: filewatchdogtest
> > > > 28/62 Test #28: filewatchdogtest .......................   Passed
> > 0.13
> > > > sec
> > > >      Start 29: inetaddresstestcase
> > > > 29/62 Test #29: inetaddresstestcase ....................   Passed
> > 0.13
> > > > sec
> > > >      Start 30: iso8601dateformattestcase
> > > > 30/62 Test #30: iso8601dateformattestcase ..............   Passed
> > 0.08
> > > > sec
> > > >      Start 31: messagebuffertest
> > > > 31/62 Test #31: messagebuffertest ......................   Passed
> > 0.08
> > > > sec
> > > >      Start 32: optionconvertertestcase
> > > > 32/62 Test #32: optionconvertertestcase ................   Passed
> > 0.10
> > > > sec
> > > >      Start 33: propertiestestcase
> > > > 33/62 Test #33: propertiestestcase .....................   Passed
> > 0.15
> > > > sec
> > > >      Start 34: relativetimedateformattestcase
> > > > 34/62 Test #34: relativetimedateformattestcase .........   Passed
> > 0.07
> > > > sec
> > > >      Start 35: stringhelpertestcase
> > > > 35/62 Test #35: stringhelpertestcase ...................   Passed
> > 0.08
> > > > sec
> > > >      Start 36: stringtokenizertestcase
> > > > 36/62 Test #36: stringtokenizertestcase ................   Passed
> > 0.07
> > > > sec
> > > >      Start 37: syslogwritertest
> > > > 37/62 Test #37: syslogwritertest .......................   Passed
> > 0.11
> > > > sec
> > > >      Start 38: timezonetestcase
> > > > 38/62 Test #38: timezonetestcase .......................   Passed
> > 0.08
> > > > sec
> > > >      Start 39: transcodertestcase
> > > > 39/62 Test #39: transcodertestcase .....................   Passed
> > 0.08
> > > > sec
> > > >      Start 40: threadutilitytestcase
> > > > 40/62 Test #40: threadutilitytestcase ..................   Passed
> > 0.08
> > > > sec
> > > >      Start 41: xloggertestcase
> > > > 41/62 Test #41: xloggertestcase ........................   Passed
> > 0.09
> > > > sec
> > > >      Start 42: defaultinittestcase
> > > > 42/62 Test #42: defaultinittestcase ....................   Passed
> > 0.10
> > > > sec
> > > >      Start 43: filtertests
> > > > 43/62 Test #43: filtertests ............................   Passed
> > 0.10
> > > > sec
> > > >      Start 44: socketappendertestcase
> > > > 44/62 Test #44: socketappendertestcase .................   Passed
> > 0.08
> > > > sec
> > > >      Start 45: sockethubappendertestcase
> > > > 45/62 Test #45: sockethubappendertestcase ..............   Passed
> > 2.08
> > > > sec
> > > >      Start 46: syslogappendertestcase
> > > > 46/62 Test #46: syslogappendertestcase .................   Passed
> > 0.08
> > > > sec
> > > >      Start 47: telnetappendertestcase
> > > > 47/62 Test #47: telnetappendertestcase .................   Passed
> > 2.08
> > > > sec
> > > >      Start 48: xmlsocketappendertestcase
> > > > 48/62 Test #48: xmlsocketappendertestcase ..............   Passed
> > 0.08
> > > > sec
> > > >      Start 49: socketservertestcase
> > > > 49/62 Test #49: socketservertestcase ...................***Failed
> >  13.20
> > > > sec
> > > >      Start 50: patternparsertestcase
> > > > 50/62 Test #50: patternparsertestcase ..................   Passed
> > 0.09
> > > > sec
> > > >      Start 51: filenamepatterntestcase
> > > > 51/62 Test #51: filenamepatterntestcase ................   Passed
> > 0.08
> > > > sec
> > > >      Start 52: filterbasedrollingtest
> > > > 52/62 Test #52: filterbasedrollingtest .................   Passed
> > 0.10
> > > > sec
> > > >      Start 53: manualrollingtest
> > > > 53/62 Test #53: manualrollingtest ......................   Passed
> > 0.09
> > > > sec
> > > >      Start 54: obsoletedailyrollingfileappendertest
> > > > 54/62 Test #54: obsoletedailyrollingfileappendertest ...   Passed
> > 5.19
> > > > sec
> > > >      Start 55: obsoleterollingfileappendertest
> > > > 55/62 Test #55: obsoleterollingfileappendertest ........   Passed
> > 5.20
> > > > sec
> > > >      Start 56: sizebasedrollingtest
> > > > 56/62 Test #56: sizebasedrollingtest ...................   Passed
> > 0.14
> > > > sec
> > > >      Start 57: timebasedrollingtest
> > > > 57/62 Test #57: timebasedrollingtest ...................   Passed
> >  27.70
> > > > sec
> > > >      Start 58: spitestcase
> > > > 58/62 Test #58: spitestcase ............................   Passed
> > 0.09
> > > > sec
> > > >      Start 59: errorhandlertestcase
> > > > 59/62 Test #59: errorhandlertestcase ...................   Passed
> > 0.09
> > > > sec
> > > >      Start 60: levelmatchfiltertestcase
> > > > 60/62 Test #60: levelmatchfiltertestcase ...............   Passed
> > 0.09
> > > > sec
> > > >      Start 61: levelrangefiltertestcase
> > > > 61/62 Test #61: levelrangefiltertestcase ...............   Passed
> > 0.09
> > > > sec
> > > >      Start 62: xmltests
> > > > 62/62 Test #62: xmltests ...............................   Passed
> > 0.14
> > > > sec
> > > >
> > > > 98% tests passed, 1 tests failed out of 62
> > > >
> > > > Total Test time (real) =  87.22 sec
> > > >
> > > > The following tests FAILED:
> > > > 49 - socketservertestcase (Failed)
> > > > Errors while running CTest
> > > > Output from these tests are in:
> > > >
> > /Users/bkirnum/Documents/GitHub/logging-log4cxx/build/Testing/Temporary/LastTest.log
> > > > Use "--rerun-failed --output-on-failure" to re-run the failed cases
> > > > verbosely.
> > > > make: *** [test] Error 8
> > > >
> > > >> On Wed, Oct 27, 2021 at 12:35 PM Robert Middleton <
> > rmiddle...@apache.org>
> > > >> wrote:
> > > >>
> > > >> Bob,
> > > >>
> > > >> I don't use MacOS, so I don't know why that would happen.  Builds on
> > > >> MacOS through github actions are ok(but that is using 10.15).
> > > >> Assuming that your stack trace is correct, it's complaining about line
> > > >> 159 in class.cpp, which is just 'return true'.
> > > >>
> > > >> Are you able to run the unit tests at all?
> > > >>
> > > >> -Robert Middleton
> > > >>
> > > >>> On Wed, Oct 27, 2021 at 11:49 AM Bob Kirnum <bkir...@gmail.com>
> > wrote:
> > > >>>
> > > >>> Running application dynamically linked with log4cxx started crashing
> > > >> after
> > > >>> upgrading MacOs to Monterey.  I tried building a debug version from
> > > >> source
> > > >>> but get the same error.  Back trace shown below.  Looks like
> > something is
> > > >>> missing in the environment but there are no cmake or build errors.
> > Any
> > > >>> suggestions?  I'd rather not have to downgrade back to Big Sur as it
> > > >> would
> > > >>> require erasing my MacBook.
> > > >>>
> > > >>>
> > > >>> (lldb) bt
> > > >>> * thread #1, stop reason = signal SIGSTOP
> > > >>>  * frame #0: 0x0000000000000000
> > > >>>    frame #1: 0x0000000113f3bd4d
> > > >>>
> > > >>
> > liblog4cxx.12.dylib`log4cxx::helpers::Class::registerClass(newClass=0x00000001140db358)
> > > >>> at class.cpp:159:2
> > > >>>    frame #2: 0x0000000113f4034b
> > > >>>
> > > >>
> > liblog4cxx.12.dylib`log4cxx::helpers::ClassRegistration::ClassRegistration(this=0x00000001140db368,
> > > >>>
> > > >>
> > accessor=(liblog4cxx.12.dylib`log4cxx::pattern::ClassNamePatternConverter::getStaticClass()
> > > >>> at classnamepatternconverter.cpp:32))()) at
> > classregistration.cpp:26:2
> > > >>>    frame #3: 0x0000000113f4037d
> > > >>>
> > > >>
> > liblog4cxx.12.dylib`log4cxx::helpers::ClassRegistration::ClassRegistration(this=0x00000001140db368,
> > > >>>
> > > >>
> > accessor=(liblog4cxx.12.dylib`log4cxx::pattern::ClassNamePatternConverter::getStaticClass()
> > > >>> at classnamepatternconverter.cpp:32))()) at
> > classregistration.cpp:25:1
> > > >>>    frame #4: 0x0000000113f3e83d
> > > >>>
> > > >>
> > liblog4cxx.12.dylib`log4cxx::pattern::ClassNamePatternConverter::registerClass()
> > > >>> at classnamepatternconverter.cpp:32:1
> > > >>>    frame #5: 0x0000000113f40309
> > > >>> liblog4cxx.12.dylib`::__cxx_global_var_init() at
> > > >>> classnamepatternconverter.cpp:32:1
> > > >>>    frame #6: 0x0000000113f40329
> > > >>> liblog4cxx.12.dylib`_GLOBAL__sub_I_classnamepatternconverter.cpp at
> > > >>> classnamepatternconverter.cpp:0
> > > >>>    frame #7: 0x000000011e9e2b49 dyld`invocation function for block in
> > > >>> dyld4::Loader::findAndRunAllInitializers(dyld4::RuntimeState&) const
> > +
> > > >> 182
> > > >>>    frame #8: 0x000000011ea0929b dyld`invocation function for block in
> > > >>> dyld3::MachOAnalyzer::forEachInitializer(Diagnostics&,
> > > >>> dyld3::MachOAnalyzer::VMAddrConverter const&, void (unsigned int)
> > > >>> block_pointer, void const*) const + 242
> > > >>>    frame #9: 0x000000011ea00893 dyld`invocation function for block in
> > > >>> dyld3::MachOFile::forEachSection(void (dyld3::MachOFile::SectionInfo
> > > >>> const&, bool, bool&) block_pointer) const + 566
> > > >>>    frame #10: 0x000000011e9cfd91
> > > >>> dyld`dyld3::MachOFile::forEachLoadCommand(Diagnostics&, void
> > > >> (load_command
> > > >>> const*, bool&) block_pointer) const + 129
> > > >>>    frame #11: 0x000000011ea0061b
> > > >>> dyld`dyld3::MachOFile::forEachSection(void
> > (dyld3::MachOFile::SectionInfo
> > > >>> const&, bool, bool&) block_pointer) const + 179
> > > >>>    frame #12: 0x000000011ea08df2
> > > >>> dyld`dyld3::MachOAnalyzer::forEachInitializer(Diagnostics&,
> > > >>> dyld3::MachOAnalyzer::VMAddrConverter const&, void (unsigned int)
> > > >>> block_pointer, void const*) const + 466
> > > >>>    frame #13: 0x000000011e9e2a7c
> > > >>> dyld`dyld4::Loader::findAndRunAllInitializers(dyld4::RuntimeState&)
> > > >> const +
> > > >>> 144
> > > >>>    frame #14: 0x000000011e9e2c08
> > > >>> dyld`dyld4::Loader::runInitializersBottomUp(dyld4::RuntimeState&,
> > > >>> dyld3::Array<dyld4::Loader const*>&) const + 178
> > > >>>    frame #15: 0x000000011e9e2beb
> > > >>> dyld`dyld4::Loader::runInitializersBottomUp(dyld4::RuntimeState&,
> > > >>> dyld3::Array<dyld4::Loader const*>&) const + 149
> > > >>>    frame #16: 0x000000011e9e2cac
> > > >>>
> > > >>
> > dyld`dyld4::Loader::runInitializersBottomUpPlusUpwardLinks(dyld4::RuntimeState&)
> > > >>> const + 108
> > > >>>    frame #17: 0x000000011e9f632e
> > > >>> dyld`dyld4::APIs::runAllInitializersForMain() + 222
> > > >>>    frame #18: 0x000000011e9d4358 dyld`dyld4::prepare(dyld4::APIs&,
> > > >>> dyld3::MachOAnalyzer const*) + 3438
> > > >>>    frame #19: 0x000000011e9d34b4 dyld`start + 388
> > > >>
> >

Reply via email to