Forum: PC-Programmierung Linux, Ruby C++ Extension,, Valgrind usw.


von Stefan Salewski (Gast)


Lesenswert?

Kennt sich hier jemand mit valgrind usw. aus?

Vermutlich nicht, aber mit Google finde ich momentan auch nicht viel zum 
Problem.

Meine C++ extension für Ruby nutzt die Fibonacci-Queue der Boost-Library 
-- eigentlich funktioniert das auch, aber bei intensiven Tests treten 
doch einige mögliche Unstimmingkeiten auf...

Ich habe dann gestern mal einen Minimaltest mit Valgrind laufen lassen, 
der Test selber liefert leider die Ergebnisse, die ich erwarte, sonst 
wäre die Fehlersuche einfacher. Aber Valgrind sagt folgendes, mit dem 
ich derzeit nicht viel anfangen kann:
1
stefan@AMD64X2 ~/RBOOST $ valgrind --partial-loads-ok=yes --undef-value-errors=no ruby test.rb 
2
==2435== Memcheck, a memory error detector
3
==2435== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
4
==2435== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
5
==2435== Command: ruby test.rb
6
==2435== 
7
Instance of class My with @x = 37
8
#<My:0x000000072ce668>
9
12.0
10
Instance of class My with @x = 44
11
#<My:0x000000072ce640>
12
15.0
13
11.0
14
Instance of class My with @x = 37
15
#<My:0x000000072ce668>
16
==2435== Invalid read of size 8
17
==2435==    at 0x7537DD0: fqueue_pop (in /home/stefan/RBOOST/rboost_fibonacci_queue.so)
18
==2435==    by 0x4F8F9EE: ??? (in /usr/lib64/libruby20.so.2.0.0)
19
==2435==    by 0x4F9E7ED: ??? (in /usr/lib64/libruby20.so.2.0.0)
20
==2435==    by 0x4F938FB: ??? (in /usr/lib64/libruby20.so.2.0.0)
21
==2435==    by 0x4F97D4F: ??? (in /usr/lib64/libruby20.so.2.0.0)
22
==2435==    by 0x4FA1656: rb_iseq_eval_main (in /usr/lib64/libruby20.so.2.0.0)
23
==2435==    by 0x4E99EC9: ??? (in /usr/lib64/libruby20.so.2.0.0)
24
==2435==    by 0x4E9AE7C: ruby_exec_node (in /usr/lib64/libruby20.so.2.0.0)
25
==2435==    by 0x4E9CA8D: ruby_run_node (in /usr/lib64/libruby20.so.2.0.0)
26
==2435==    by 0x40098A: ??? (in /usr/bin/ruby20)
27
==2435==    by 0x52A66C4: (below main) (in /lib64/libc-2.15.so)
28
==2435==  Address 0x72e6450 is 32 bytes inside a block of size 88 free'd
29
==2435==    at 0x4C2AF1C: operator delete(void*) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
30
==2435==    by 0x7537DB4: fqueue_pop (in /home/stefan/RBOOST/rboost_fibonacci_queue.so)
31
==2435==    by 0x4F8F9EE: ??? (in /usr/lib64/libruby20.so.2.0.0)
32
==2435==    by 0x4F9E7ED: ??? (in /usr/lib64/libruby20.so.2.0.0)
33
==2435==    by 0x4F938FB: ??? (in /usr/lib64/libruby20.so.2.0.0)
34
==2435==    by 0x4F97D4F: ??? (in /usr/lib64/libruby20.so.2.0.0)
35
==2435==    by 0x4FA1656: rb_iseq_eval_main (in /usr/lib64/libruby20.so.2.0.0)
36
==2435==    by 0x4E99EC9: ??? (in /usr/lib64/libruby20.so.2.0.0)
37
==2435==    by 0x4E9AE7C: ruby_exec_node (in /usr/lib64/libruby20.so.2.0.0)
38
==2435==    by 0x4E9CA8D: ruby_run_node (in /usr/lib64/libruby20.so.2.0.0)
39
==2435==    by 0x40098A: ??? (in /usr/bin/ruby20)
40
==2435==    by 0x52A66C4: (below main) (in /lib64/libc-2.15.so)

von Kindergärtner (Gast)


Lesenswert?

Schau mal in Zeile 42, ich glaube da ist ein ")" zu viel.

von Test123 (Gast)


Lesenswert?

Bzgl. "Invalid read of size 8":

http://valgrind.org/docs/manual/mc-manual.html#mc-manual.badrw

Du könntest z.B. auf schon freigegebenen Speicher zugreifen.

Ansonsten, wie schon von "Kindergärtner" angemerkt sind das jetzt nicht 
übermäßig viele Infos mit denen man etwas anfangen könnte um dir zu 
helfen.

von Stefan Salewski (Gast)


Lesenswert?

Test123 schrieb:
> Du könntest z.B. auf schon freigegebenen Speicher zugreifen.
>
> Ansonsten, wie schon von "Kindergärtner" angemerkt sind das jetzt nicht
> übermäßig viele Infos mit denen man etwas anfangen könnte um dir zu
> helfen.

Ja, dass ist ja gerade das Problem.
Wobei  "fqueue_pop" mir ja immerhin sagt, dass das Problem beim Lesen 
auftreten mag -- wenn es denn wirklich ei n Problem ist, und nicht 
einfach eine Fehlmeldung von Valgrind. Ich hätte die Probleme eher beim 
Schreiben erwartet, das ist ja eher die kritische Sache.

Naja, vielleicht melden sich Buchehgger oder Yalu ja noch.
Falls tatsächlich jemand den Code ansehen möchte -- das Paket ist 
natürlich auf meiner Homepage verfügbar.

von Kindergärtner (Gast)


Lesenswert?

Stefan Salewski schrieb:
> Naja, vielleicht melden sich Buchehgger oder Yalu ja noch.
Wenn sie so nett sind deine Homepage zu googeln und deinen Code zu 
suchen... Mit valgrinds Meldung allein kann man gar nichts sagen. Aber 
wenn du nicht mal so entgegenkommend bist deinen Code einfach zugänglich 
zu zeigen will dir auch keiner helfen.
> Falls tatsächlich jemand den Code ansehen möchte -- das Paket ist
> natürlich auf meiner Homepage verfügbar.

von Stefan Salewski (Gast)


Lesenswert?

Kindergärtner schrieb:
> Wenn sie so nett sind deine Homepage zu googeln und deinen Code zu
> suchen... Mit valgrinds Meldung allein kann man gar nichts sagen. Aber
> wenn du nicht mal so entgegenkommend bist deinen Code einfach zugänglich
> zu zeigen will dir auch keiner helfen.

Na ja ich mache mir da keine großen Hoffnungen, den Code wird sich wohl 
kaum jemand ansehen mögen.
C++ und Ruby ist schon etwas knifflig, selbst mit C Extensions kennen 
sich nur wenige Experten aus. Ich musste ja damals die C++Extension für 
CGAL Delaunay Triangulation schreiben, und da ich schon dabei war, hatte 
ich dann gleich die Fibonacci Queue von Boost mitverarztet. Die 
Delaunay-Triangulation ist unverzichtbar -- für die Priority Queue gibt 
es zum Glück Alternativen. Ich glaube irgendwie kann man den GNU 
Debugger gdb in Verbindung mit Valgrind nutzen. Leider funktioniert 
Valgrind nicht zusammen mit CGAL, die Floating-Point Rundung wird wohl 
von Valgrind nicht so simuliert wie CGAL es benötigt.

Übrigens Andreas, die Schrift in diesem Eingabefeld ist wirklich winzig 
-- bei Firefox, und jetzt unter dem Webbrowser von Gnome3 erst recht. In 
der Vorschau ist die Größe OK.

von Kindergärtner (Gast)


Lesenswert?

Stefan Salewski schrieb:
> Leider funktioniert
> Valgrind nicht zusammen mit CGAL, die Floating-Point Rundung wird wohl
> von Valgrind nicht so simuliert wie CGAL es benötigt.
Valgrind emuliert keine CPU&FPU, d.h. die float-Rechnungen sind exakt so 
wie im normalen Betrieb. Vermutlich sind nur deine Speicherfehler derart 
übel dass du die falschen Zahlen nimmst...

von Stefan Salewski (Gast)


Lesenswert?

Kindergärtner schrieb:
> Valgrind emuliert keine CPU&FPU, d.h. die float-Rechnungen sind exakt so
> wie im normalen Betrieb. Vermutlich sind nur deine Speicherfehler derart
> übel dass du die falschen Zahlen nimmst...

Bis Gestern hätte ich Dir das womöglich noch geglaubt -- aber ich hatte 
dann doch noch etwas gegoogelt.

http://cgal-discuss.949826.n4.nabble.com/CGAL-assertion-when-run-using-valgrind-td950289.html

>Running some internal tests, I have discovered that the FPU rounding mode is
>not correctly handled by valgrind. Actually, that is even a documented
l>imitation :
 > http://valgrind.org/docs/manual/manual-core.html
>"2.11. Limitations

Wobei -- wie Valgrind das genau maucht weiss ich nicht -- irdendwer 
hatte da Gestern irgendwo vom FPU Simulation geschrieben. Das Problem 
existiert jedenfalls, irgendwie kann man das wohl hinbekommen, aber auch 
das ist nicht ganz einfach mit Ruby, da die extensions nicht mit CMake 
gebaut werden.

PS: Freu dich dass du Kindergärtner und nicht Gesamtschullehrer geworden 
bist -- was da gestern auf Panorama kam war ja erschreckend. Die kleinen 
sind ja noch lieb...

von Noch der Selbe (Gast)


Lesenswert?

Ha!

Ich glaube fast, ich habe es.
1
extern "C" VALUE fqueue_delete_top(VALUE self)
2
{
3
  XPQ *pq;
4
  Data_Get_Struct(self, XPQ, pq);
5
  if (pq->empty()) return Qfalse;
6
  const heap_data& hd = pq->top();
7
  pq->pop();
8
  rb_ivar_set(hd.data, ID_heap_node_heap_data, Qnil);
9
  return Qtrue;
10
}

Nach
hd = pq->top();
pq->pop();
hd.data

Nach pop() ist wohl hd und damit auch hd.data undefiniert.

Ich denke mal ein Fehler war das -- aber ob damit nun alles erledigt 
ist?

von Salewski, Stefan (Gast)


Lesenswert?

Noch der Selbe schrieb:
> aber ob damit nun alles erledigt
> ist?

Wohl nicht. Hätte mich auch etwas gewundert, wenn sich eine 
Speicherfreigabe einige ns zu früh merklich auswirkt. Valgrind meckert 
jetzt nicht mehr im Testprogramm, aber das eigentliche Routing-Programm 
gibt teils doch etwas unkonsistente Werte und vereinzelt auch die 
Meldung "can't modify frozen String" was mir auch nicht ganz geheuer 
ist. Ich habe mal eine ganz triviale Schlange in Ruby gebastelt
1
  class Plain_Queue
2
    def initialize
3
      @h = Hash.new
4
    end
5
    def []=(el, k)
6
      @h[el] = k
7
    end
8
    def pop
9
      x = @h.to_a.min_by{|el| el[1]}
10
      @h.delete(x[0])
11
      return x
12
    end
13
  end
Damit scheint es keine Probleme zu geben.

Nun mag man einwenden ich hätte doch besser Python verwenden sollen -- 
nun ja, die Priority_Queue hat man da schon mal, wie es mit der 
Delaunay-Triangulation aussieht weiss ich nicht, Bindings zu CGAL gibt 
es wohl irgendwo. Oder man hätte alles in C++ machen können, aber da 
hätte ich sicher noch viel mehr Probleme bekommen und schon lange die 
Lust verloren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.