[Networkit] Debugging in NetworKit

Christian Staudt christian.staudt at kit.edu
Wed Jan 14 14:03:56 CET 2015


Hi Patrick,
I’m answering your email via the NetworKit list so that others can also benefit from the discussion. Please use the list in the future for things of general interest, like your questions:

1. How to get stack traces?
2. How do log levels work?


1. Debugging and stack traces

You have basically figured it out already: To debug an error in the C++ layer, write a unit test case that triggers the error and run it through your favorite debugging tool, e.g. gdb or valgrind.

2. Log levels 

When building NetworKit, the core library is built in optimized mode. In this mode the compiler automatically removes log statements of level DEBUG and TRACE. Programmers tend to leave them laying around in critical loops after they’re done debugging, which degrades performance. To keep these statements, build with —optimize=Dbg, e.g.

python3 setup.py develop --optimize=Dbg

Now the following example outputs the low level log statements in the (I)Python console:

In [1]: from networkit import *
setLO
In [2]: setLogLevel("TRACE")

In [3]: G = generators.ErdosRenyiGenerator(100, 0.1, directed=True).generate()

In [4]: community.PLP(G).run()
[INFO ][“networkit/cpp/community/PLP.cpp”, 75: virtual void NetworKit::PLP::run()]: [BEGIN] LabelPropagation: iteration #1
[DEBUG][“networkit/cpp/community/PLP.cpp”, 116: virtual void NetworKit::PLP::run()]: [DONE] LabelPropagation: iteration #1 - updated 87 labels, time spent: (0 ms) 
[INFO ][“networkit/cpp/community/PLP.cpp”, 75: virtual void NetworKit::PLP::run()]: [BEGIN] LabelPropagation: iteration #2
[DEBUG][“networkit/cpp/community/PLP.cpp”, 116: virtual void NetworKit::PLP::run()]: [DONE] LabelPropagation: iteration #2 - updated 2 labels, time spent: (0 ms) 
[INFO ][“networkit/cpp/community/PLP.cpp”, 75: virtual void NetworKit::PLP::run()]: [BEGIN] LabelPropagation: iteration #3
[DEBUG][“networkit/cpp/community/PLP.cpp”, 116: virtual void NetworKit::PLP::run()]: [DONE] LabelPropagation: iteration #3 - updated 0 labels, time spent: (0 ms) 
Out[4]: <_NetworKit.PLP at 0x10be19390>

However, the output is not visible in the IPython Notebook, because it is not redirected to the notebook (which is not trivial to fix, according to [1]). If you want text output in the notebook, use Python-based print or log statements. Debugging of C++ code is not the ideal scenario for the IPython Notebook anyway.

[1]: https://stackoverflow.com/questions/21284817/how-to-show-log-statements-of-extension-module-in-ipython-notebook

Chris





Am 14.01.2015 um 01:38 schrieb Patrick Bisenius <patrick.bisenius at gmail.com>:

> Guten Tag Herr Staudt,
> 
> ich habe inzwischen damit begonnen, einen Multilevel-Partitionierer auf Basis von Label Propagation in NetworKit zu implementieren. Ich habe es auch schon geschafft, die C++-Klasse via Cython in Python benutzbar zu machen. Zum Testen verwende ich momentan ein IPython-Notebook, in dem ich einen zufälligen Graphen generiere und diesen dann partitioniere. Nun habe ich aber das Problem, dass meine Implementierung noch fehlerhaft ist und abstürzt. 
> 
> Wie gehe ich denn am besten vor, wenn ich einen Stacktrace von meinem Crash haben möchte? Einfallen würde mir, NetworKit als Library in einer Art Testprogramm (bzw. einfach in einem Testcase für NetworKit) einzubinden und dieses Programm dann mit gdb (https://www.gnu.org/software/gdb/) laufen zu lassen. Gibt es da einen geschickteren Weg?
> 
> Außerdem ist mir aufgefallen, dass setLogLevel("DEBUG“) im IPython-Notebook bei mir nichts zu bewirken scheint. Ich nehme an, man muss dazu zusätzlich noch mit --optimize=Dbg kompilieren?
> 
> Versucht habe ich folgendes (siehe https://networkit.iti.kit.edu/data/uploads/docs/Readme.pdf):
> 
> python3 setup.py build_ext --inplace -j4 --optimize=Dbg 
> 
> Das wirft aber zumindest unter OS X dann folgenden Fehler:
> 
> ld: library not found for -lNetworKit-Core-Dbg
> collect2: error: ld returned 1 exit status
> 
> ———
> 
> Um es zusammenzufassen, zwei Fragen:
> 
> 1. Was ist der geschickteste Weg um an Stacktraces zu kommen?
> 
> 2. Muss ich außer setLogLevel("DEBUG“) noch etwas beachten, wenn ich DEBUG()-Meldungen auf der IPython-Konsolenausgabe haben möchte? Alternativ könnte ich auch einfach überall INFO() verwenden, aber das ist wohl nicht Sinn der Sache.
> 
> Vielen Dank im Voraus!
> 
> Mit freundlichem Gruß
> Patrick Bisenius
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ira.uni-karlsruhe.de/mailman/private/networkit/attachments/20150114/e6d2f45e/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 495 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <https://lists.ira.uni-karlsruhe.de/mailman/private/networkit/attachments/20150114/e6d2f45e/attachment.sig>


More information about the NetworKit mailing list