Note that you may also just be able to configure this at runtime.
Assuming that you are using a configuration file to configure Log4cxx,
you can probably set the ThreadConfigurationType to not name threads,
meaning the code is never called.  See this documentation for more
details: 
https://logging.apache.org/log4cxx/latest_stable/threading.html#threading-notes

-Robert Middleton

On Thu, Dec 1, 2022 at 8:20 AM Robert Middleton <osfan6...@gmail.com> wrote:
>
> Hi Michael,
>
> The best thing for me to recommend is to simply comment out the checks
> for SetThreadDescription and GetThreadDescription as you have done.
> This is really designed to be an optional feature, such that you can
> print out the name of the thread rather than just its ID in hex.  At
> least under Linux and GDB this also means that the thread name will
> show up in the debugger; I assume the same is true on Windows.
>
> -Robert Middleton
>
> On Thu, Dec 1, 2022 at 6:55 AM Michael Schumacher
> <michael.schumac...@inform-software.com> wrote:
> >
> > Hi,
> >
> >
> >
> > we have an issue with log4cxx.dll, version 0.13.0; here is what we found 
> > out so far:
> >
> > We built log4cxx.dll on a Windows Server 2019 with cmake (from the 
> > downloaded apache-log4cxx-0.13.0.zip).
> >
> > In apache-log4cxx-0.13.0\src\main\include\CMakeLists.txt the four lines 
> > below activate the SetThreadDescription / GetThreadDescription calls 
> > (because in the Windows SDK on that machine processthreadapi.h contains 
> > Set/GetThreadDescription):
> > if(WIN32)
> >     CHECK_SYMBOL_EXISTS(SetThreadDescription 
> > "windows.h;processthreadsapi.h" HAS_SETTHREADDESCRIPTION)
> >     CHECK_SYMBOL_EXISTS(GetThreadDescription 
> > "windows.h;processthreadsapi.h" HAS_GETTHREADDESCRIPTION)
> > endif(WIN32)
> > And here is the call in threadutility.cpp:
> > ...
> > #elif LOG4CXX_HAS_SETTHREADDESCRIPTION
> >    HRESULT hr = SetThreadDescription(static_cast<HANDLE>(nativeHandle), 
> > threadName.c_str());
> > ...
> > That means now log4cxx.dll needs an entry point for SetThreadDescription as 
> > soon as a client program that linked log4cxx.lib is started
> >
> > I made a small console program (named logConsole) with only one call to 
> > log4cxx in main() (after the “Hello World!” std::cout  output):
> > log4cxx::helpers::LogLog::setQuietMode(true);
> > On a Windows Server 2019 or on Windows 10, the program starts and I see 
> > ‘Hello World!’
> > Now the issue: on a Windows Server 2016 (version 1607), the program does 
> > not start up at all.
> >
> > In the event viewer’s system log, the following “Application popup” message 
> > appears:
> > Application popup: logConsole.exe - Entry Point Not Found : The procedure 
> > entry point SetThreadDescription could not be located in the dynamic link 
> > library C:\Users\xyz\Documents\log4cxx.dll.
> >
> >
> >
> > That means any program that uses this log4cxx.dll compiled on Windows 10 
> > won’t even start up on Windows Server 2016.
> >
> >
> >
> > Here is what Microsoft says in:
> > https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-setthreaddescription
> >
> > Windows Server 2016, Windows 10 LTSB 2016 and Windows 10 version 1607: 
> > SetThreadDescription is only available by Run Time Dynamic Linking in 
> > KernelBase.dll.
> >
> >
> >
> > As far as I can see there is no Run Time Dynamic Linking (via LoadLibrary) 
> > in the source code around the SetThreadDescription and GetThreadDescription 
> > calls.
> >
> >
> >
> > Has anyone an idea what to do to avoid the problem on old machines?
> >
> >
> >
> > My first guess is to delete these lines (but then the new calls are never 
> > made):
> >
> > if(WIN32)
> >     CHECK_SYMBOL_EXISTS(SetThreadDescription 
> > "windows.h;processthreadsapi.h" HAS_SETTHREADDESCRIPTION)
> >     CHECK_SYMBOL_EXISTS(GetThreadDescription 
> > "windows.h;processthreadsapi.h" HAS_GETTHREADDESCRIPTION)
> > endif(WIN32)
> >
> >
> >
> > Thank you in advance for any responses!
> >
> >
> >
> > Best Regards,
> >
> > Michael
> >
> >
> >
> >

Reply via email to