What
The GNU gdb
debugger can be used to process core
files and obtain a stack trace of calls made by a process leading up to it crashing for analysis.
Why
A gdb stack trace can be used by development to analyse the sequence of calls being made leading up to a crash and correlate with the source code and possibly determine the cause of the crash and fix.
How
For Virtuoso commercial
builds an unstripped debug version of the Virtuoso binary would need to be provided by OpenLink.
For Virtuoso open source
the following steps need to be performed to build an unstripped debug version of the Virtuoso binary with symbols left intact in the binary, such that a meaningful stack trace can be obtained:
- Configure the Virtuoso build using the
—with debug
option:./configure —with-debug
- In the
Makefile
, check to ensureCFLAGS
has the-g
option set which generates debug information:CFLAGS = -g -O2
- Then perform a
make clean all
&make
to build a new debug unstripped Virtuoso binary (virtuoso-t
).make clean all make
- Ensure
core
file creation is enabled with the command:ulimit -c unlimited
Start the Virtuoso database with the new Virtuoso unstripped debug binary and force the crash condition again to generate a new core
file, then:
- Use
gdb
to load thecore
file with the command:gdb virtuoso-t corefile
- At the
(gdb)
prompt, typebt
orbacktrace
to back trace through stack and provide the output when top of stack is reached:$ gdb /opt/virtuoso/bin/virtuoso-t core.31731 GNU gdb (GDB) Red Hat Enterprise Linux (7.2-92.el6) Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /opt/virtuoso/bin/virtuoso...done. [New Thread 6025] [New Thread 6028] . . . Core was generated by `/opt/virtuoso/bin/virtuoso'. Program terminated with signal 6, Aborted. #0 0x0000003ad2a324f5 in raise () from /lib64/libc.so.6 Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.212.el6_10.3.x86_64 libaio-0.3.107-10.el6.x86_64 libgcc-4.4.7-23.el6.x86_64 libstdc++-4.4.7-23.el6.x86_64 (gdb) bt #0 0x0000003ad2a324f5 in raise () from /lib64/libc.so.6 #1 0x0000003ad2a33cd5 in abort () from /lib64/libc.so.6 #2 0x0000003ad2a70417 in __libc_message () from /lib64/libc.so.6 #3 0x0000003ad2a75e5e in malloc_printerr () from /lib64/libc.so.6 #4 0x0000003ad2a78cad in _int_free () from /lib64/libc.so.6 #5 0x0000000000b60468 in dk_free (ptr=0x7f8cf8fb3218, sz=65544) at Dkalloc.c:947 #6 0x0000000000b65aad in dk_free_tree (box=0x7f8cf8fb3220) at Dkbox.c:808 #7 0x00000000006a665a in ssl_free_data_v (sl=0x7f8c2400a8a0, data=0x7f8cf8fb3020 "", inst=0x7f8c2400d338) at sqlrun.c:226 #8 0x00000000006a6ee1 in qi_inst_state_free (qi_box=0x7f8c2400d338) at sqlrun.c:556 #9 0x00000000006b0cf4 in qi_free (inst=0x7f8c2400d338) at sqlrun.c:3113 #10 0x00000000007a0e09 in cl_qf_exec (clt=0x7f8da84da610, clo=0x7f8c24016b58) at clop.c:2298 #11 0x00000000007a2006 in cls_qf (clt=0x7f8da84da610, clo=0x7f8c24016b58, is_continue=0) at clop.c:2568 #12 0x00000000007a49ac in clt_process_cm (clt=0x7f8da84da610, cm=0x7f8da89d4160) at clop.c:3343 #13 0x00000000007202c5 in cluster_thread_func (clt=0x7f8da84da610) at clsrv.c:364 #14 0x0000000000de4eff in _thread_boot (arg=0x7f8da8d87b20) at sched_pthread.c:303 #15 0x0000003ad3607aa1 in start_thread () from /lib64/libpthread.so.0 #16 0x0000003ad2ae8c4d in clone () from /lib64/libc.so.6 (gdb) (gdb) quit $
Start Virtuoso with gdb
Virtuoso can also be run within gdb
, with the command and left run as such with the commands below run from the database
directory:
gdb virtuoso-t
gdb> run -f
Should Virtuoso crash, it will remain in the debugger, and the stack trace can be obtained:
]$ gdb ./virtuoso-t
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-80.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /opt/virtuoso/bin/virtuoso-t ...done.
(gdb) run -f
Starting program: /opt/virtuoso/bin/virtuoso-t -f
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Wed Oct 23 2019
21:03:21 { Loading plugin 1: Type `plain', file `wikiv' in `../hosting'
warning: Ignoring non-absolute filename: <../hosting/wikiv.so>
Missing separate debuginfo for ../hosting/wikiv.so
21:03:21 WikiV version 0.6 from OpenLink Software
21:03:21 Support functions for WikiV collaboration tool
21:03:21 SUCCESS plugin 1: loaded from ../hosting/wikiv.so }
21:03:21 { Loading plugin 2: Type `plain', file `mediawiki' in `../hosting'
warning: Ignoring non-absolute filename: <../hosting/mediawiki.so>
Missing separate debuginfo for ../hosting/mediawiki.so
21:03:21 MediaWiki version 0.1 from OpenLink Software
21:03:21 Support functions for MediaWiki collaboration tool
21:03:21 SUCCESS plugin 2: loaded from ../hosting/mediawiki.so }
21:03:21 { Loading plugin 3: Type `plain', file `creolewiki' in `../hosting'
warning: Ignoring non-absolute filename: <../hosting/creolewiki.so>
Missing separate debuginfo for ../hosting/creolewiki.so
21:03:21 CreoleWiki version 0.1 from OpenLink Software
21:03:21 Support functions for CreoleWiki collaboration tool
21:03:21 SUCCESS plugin 3: loaded from ../hosting/creolewiki.so }
21:03:21 { Loading plugin 4: Type `plain', file `im' in `../hosting'
warning: Ignoring non-absolute filename: <../hosting/im.so>
Missing separate debuginfo for ../hosting/im.so
21:03:21 IM version 0.63 from OpenLink Software
21:03:21 Support functions for Image Magick 6.9.9
21:03:21 SUCCESS plugin 4: loaded from ../hosting/im.so }
21:03:21 { Loading plugin 5: Type `plain', file `wbxml2' in `../hosting'
warning: Ignoring non-absolute filename: <../hosting/wbxml2.so>
Missing separate debuginfo for ../hosting/wbxml2.so
21:03:21 WBXML2 version 0.9 from OpenLink Software
21:03:21 Support functions for WBXML2 0.9.2 Library
21:03:21 SUCCESS plugin 5: loaded from ../hosting/wbxml2.so }
21:03:21 { Loading plugin 6: Type `attach', file `libphp5.so' in `../hosting'
warning: Ignoring non-absolute filename: <../hosting/libphp5.so>
Missing separate debuginfo for ../hosting/libphp5.so
21:03:21 SUCCESS plugin 6: loaded from ../hosting/libphp5.so }
21:03:21 { Loading plugin 7: Type `Hosting', file `hosting_php.so' in `../hosting'
warning: Ignoring non-absolute filename: <../hosting/hosting_php.so>
Missing separate debuginfo for ../hosting/hosting_php.so
21:03:21 Hosting version 3309 from OpenLink Software
21:03:21 PHP engine version 5.6.37
21:03:21 SUCCESS plugin 7: loaded from ../hosting/hosting_php.so }
21:03:21 { Loading plugin 8: Type `plain', file `qrcode' in `../hosting'
warning: Ignoring non-absolute filename: <../hosting/qrcode.so>
Missing separate debuginfo for ../hosting/qrcode.so
21:03:21 QRcode version 0.1 from OpenLink Software
21:03:21 Support functions for ISO/IEC 18004:2006, using QR Code encoder (C) 2006 Kentaro Fukuchi <fukichi@megaui.net>
21:03:21 SUCCESS plugin 8: loaded from ../hosting/qrcode.so }
21:03:21 { Loading plugin 10: Type `plain', file `proj4' in `../hosting'
warning: Ignoring non-absolute filename: <../hosting/proj4.so>
Missing separate debuginfo for ../hosting/proj4.so
21:03:21 plain version 1.0.3309 from OpenLink Software
21:03:21 Cartographic Projections support based on Frank Warmerdam's proj4 library
21:03:21 SUCCESS plugin 10: loaded from ../hosting/proj4.so }
21:03:21 { Loading plugin 11: Type `plain', file `geos' in `../hosting'
warning: Ignoring non-absolute filename: <../hosting/geos.so>
Missing separate debuginfo for ../hosting/geos.so
21:03:21 plain version 1.0.3309 from OpenLink Software
21:03:21 GEOS plugin based on Geometry Engine Open Source library from Open Source Geospatial Foundation
21:03:21 SUCCESS plugin 11: loaded from ../hosting/geos.so }
21:03:21 { Loading plugin 12: Type `plain', file `shapefileio' in `../hosting'
warning: Ignoring non-absolute filename: <../hosting/shapefileio.so>
Missing separate debuginfo for ../hosting/shapefileio.so
21:03:21 ShapefileIO version 0.1virt71 from OpenLink Software
21:03:21 Shapefile support based on Frank Warmerdam's Shapelib
21:03:21 SUCCESS plugin 12: loaded from ../hosting/shapefileio.so }
21:03:21 OpenLink Virtuoso Universal Server
21:03:21 Version 07.20.3230-pthreads for Darwin as of Oct 14 2019
21:03:21 uses parts of OpenSSL, PCRE, Html Tidy
21:03:21 Enabled Cluster Extension
21:03:21 Enabled Column Store Extension
21:03:21 Enabled Virtual Database Extension
21:03:21 Enabled Replication Extension
21:03:21 Enabled Scalable ACL Extension
21:03:21 Enabled Custom Reasoning & Inference Rules
21:03:21 Database version 3126
[New Thread 0x7fffde190700 (LWP 37719)]
21:03:21 SQL Optimizer enabled (max 1000 layouts)
21:03:22 Compiler unit is timed at 0.000171 msec
[New Thread 0x7fffcfe9d700 (LWP 37723)]
21:03:24 Roll forward started
21:03:24 Roll forward complete
[New Thread 0x7fffcce7c700 (LWP 37727)]
21:03:25 Checkpoint started
21:03:25 Checkpoint finished, log reused
[New Thread 0x7fffb6ffd700 (LWP 37730)]
[New Thread 0x7fffb67fc700 (LWP 37731)]
21:03:27 HTTP/WebDAV server online at 8890
21:03:27 Server online at 1111 (pid 37715)
21:03:27 ZeroConfig registration virtuoso (LOCALHOST)
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7bca6d5 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
Missing separate debuginfos, use: debuginfo-install glibc-2.17-106.el7_2.8.x86_64 libgcc-4.8.5-28.el7_5.1.x86_64 libstdc++-4.8.5-28.el7_5.1.x86_64 nss-softokn-freebl-3.36.0-5.el7_5.x86_64 zlib-1.2.7-15.el7.x86_64
(gdb) bt
#0 0x00007ffff7bca6d5 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x0000000000cbe7a8 in semaphore_enter (sem=0x1dcfc10) at sched_pthread.c:961
#2 0x000000000041254c in main (argc=2, argv=0x1a4e7f0) at viunix.c:766
(gdb)
Attach gdb to running Virtuoso instance to force core file generation
A core file can be created by attaching to a running Virtuoso debug binary process with “gdb” and force core file to be generated as follows:
- Attach to gdb to the Virtuoso instance Linux process id:
gdb -p <virtuoso pid>
- Generate core file in gdb with the
generate-core-file
command :
(gdb) generate-core-file <core-filename>
Close or quit gdb
and the Virtuoso instance will then continue running as normal.