view Sphinx/source/faq/crash.rst @ 1113:a588960a72e5 default tip

spelling
author Alain Mazy <am@orthanc.team>
date Mon, 28 Oct 2024 09:23:08 +0100
parents b7835da59750
children
line wrap: on
line source

.. _crash:

Crash analysis
==============

Orthanc crashes very rarely. You are most likely looking for the FAQ
entry about :ref:`debugging Orthanc <debugging>`.


.. _segfault-plugin:

Generating a segmentation fault for test purpose
------------------------------------------------

.. highlight:: cpp

Here is the source code of a minimal C++ :ref:`plugin
<creating-plugins>` that can be used to simulate a segmentation fault
within Orthanc::

  #include <orthanc/OrthancCPlugin.h>
  
  extern "C"
  {
    int32_t OrthancPluginInitialize(OrthancPluginContext* context)
    {
      // Let's trigger a segmentation fault by writing to NULL
      intptr_t *p = NULL;
      *p = 42;
      return OrthancPluginErrorCode_Success;
    }

    void OrthancPluginFinalize()
    {
    }

    const char* OrthancPluginGetName()
    {
      return "crash";
    }

    const char* OrthancPluginGetVersion()
    {
      return "0.0";
    }
  }

As soon as Orthanc will try and load this plugin, it will crash. This
gives you the opportunity to learn how to debug Orthanc on your very
specific platform.


GNU/Linux system using gdb
--------------------------

.. highlight:: bash

The Orthanc project provides precompiled binaries with debug symbols
for the mainline that can run on almost any recent GNU/Linux system
(generated thanks to the `LSB - Linux Standard Base SDK
<https://en.wikipedia.org/wiki/Linux_Standard_Base>`__). This allows
to generate a backtrace (the famous "core dumped" message) that can be
analyzed by any developer of Orthanc. Assuming that the :ref:`plugin
above <segfault-plugin>` is available as the ``crash.cpp`` file, here
is a sample debug session::

  $ wget https://orthanc.uclouvain.be/downloads/linux-standard-base/orthanc/mainline-debug/Orthanc
  $ chmod +x ./Orthanc
  $ g++ -fPIC -shared ./crash.cpp -I ~/orthanc/OrthancServer/Plugins/Include -o crash.so
  $ ulimit -c unlimited
  $ echo '{ "Plugins" : ["./crash.so"] }' > Configuration.json
  $ rm -f core ; ./Orthanc Configuration.json
  W0103 18:05:01.661466             MAIN main.cpp:2041] Orthanc version: mainline (20240103T170440)
  W0103 18:05:01.661583             MAIN main.cpp:1775] Performance warning: Non-release build, runtime debug assertions are turned on
  W0103 18:05:01.661800             MAIN OrthancConfiguration.cpp:57] Reading the configuration from: "Configuration.json"
  W0103 18:05:01.864783             MAIN main.cpp:912] Loading plugin(s) from: ./crash.so
  W0103 18:05:01.864883             MAIN PluginsManager.cpp:261] Registering plugin 'crash' (version 0.0)
  Segmentation fault (core dumped)


.. highlight:: text

This session creates a file called ``core`` in the current working
directory. If you don't see this file, it probably means that your
GNU/Linux distribution customizes the name of core files (this is for
instance the case of Ubuntu 22.04 that sends core files to
``apport``). You can temporarily disable this behavior by typing::

  $ echo core | sudo tee /proc/sys/kernel/core_pattern


You can then analyze the ``core`` file by running ``gdb`` as follows::

  $ gdb -c ./core.424217 ./Orthanc
  (gdb) bt
  #0  0x00007f5943308111 in OrthancPluginInitialize () from ./crash.so
  #1  0x00000000005e1cbc in Orthanc::CallInitialize (plugin=..., context=...)
      at /home/jodogne/BuildBotWorker/Orthanc_mainline_-_LSB_Debug/build/OrthancServer/Plugins/Engine/PluginsManager.cpp:87
  #2  0x00000000005e2f14 in Orthanc::PluginsManager::RegisterPlugin (this=0x2edc220, path="./crash.so")
      at /home/jodogne/BuildBotWorker/Orthanc_mainline_-_LSB_Debug/build/OrthancServer/Plugins/Engine/PluginsManager.cpp:264

If you are unable to analyze such a backtrace by yourself, feel free
to post your ``core`` file on the `Orthanc Users discussion forum
<https://discourse.orthanc-server.org>`__. Do not forget to indicate
the content of
`<https://orthanc.uclouvain.be/downloads/linux-standard-base/orthanc/mainline-debug/revision.txt>`__
so that we can find the version of Orthanc that generated the core
file.


**Important:** The Orthanc developers will only be able to analyze the
``core`` files generated by our own precompiled binaries!