<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[mysteriöser Segmentation Fault]]></title><description><![CDATA[<p>Hi everyone</p>
<p>Folgendes Problem: in meiner main()-Methode kopiere ich alle Argumente in einen Vektor und geben den an meine eigentlich (public static) main-Methode in meiner Hauptklasse weiter.</p>
<p>Das mache ich in jedem Programm so und es hat noch nie Probleme verursacht. Aber in diesem Fall erhalte ich nach der (korrekten) Ausführung des ganzen Programms einen Segmentation Fault. Das ist darum lästig, weil ich das Programm als via CGI aufrufen wollte und mein Webserver die Ausgabe nicht anzeigt, wenn ein Fehler aufgetreten ist.</p>
<p>Der Code dazu sieht wie folgt aus:</p>
<pre><code class="language-cpp">#include &quot;EwbConfig.h&quot;
#include &lt;iostream&gt;

using namespace ewbconfig;
using namespace std;

int main(int argc, const char *argv[]) {
    vector&lt;string&gt; args(argc);
    copy(argv, &amp;argv[argc], args.begin());

    int i = EwbConfig::main(args);
    cout &lt;&lt; &quot;everything destructed&quot; &lt;&lt; endl;
    return i;
}
</code></pre>
<p>Erst dachte ich, es könne sich nur um Fehler beim Destruieren meiner Objekte handeln, deshalb habe ich den cout ganz am Ende eingefügt (der noch vor dem SegFault angezeigt wird). Da es sich um eine static-Methode handelt wird nach dem cout sicher keine meiner Klassen mehr destruiert, sondern nur noch der vector. Anschliessend wird nur noch i zurückgegeben (=0, EwbConfig::main() gibt immer 0 zurück).</p>
<p>Wo um Himmels Willen kann da also noch ein Segmentation Fault entstehen? Man beachte, dass args als const-Reference übergeben wird.</p>
<p>Ich habe via gdb das entstandene core-File angesehen und folgenden backtrace erhalten:</p>
<pre><code>GNU gdb 6.3 (MontaVista 6.3-20.0.22.0501131 2005-07-23)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type &quot;show copying&quot; to see the conditions.
There is absolutely no warranty for GDB.  Type &quot;show warranty&quot; for details.
This GDB was configured as &quot;--host=i686-pc-linux-gnu --target=armv5teb-montavista-linuxeabi&quot;...
Core was generated by `./ewbconfig.exe'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /usr/local/xscale_be/target/lib/libewbmeter.so...done.
Loaded symbols for /usr/local/xscale_be/target/lib/libewbmeter.so
Reading symbols from /usr/local/xscale_be/target/usr/lib/libstdc++.so.6...done.
Loaded symbols for /usr/local/xscale_be/target/usr/lib/libstdc++.so.6
Reading symbols from /usr/local/xscale_be/target/lib/libm.so.6...done.
Loaded symbols for /usr/local/xscale_be/target/lib/libm.so.6
Reading symbols from /usr/local/xscale_be/target/lib/libgcc_s.so.1...done.
Loaded symbols for /usr/local/xscale_be/target/lib/libgcc_s.so.1
Reading symbols from /usr/local/xscale_be/target/lib/libc.so.6...done.
Loaded symbols for /usr/local/xscale_be/target/lib/libc.so.6
Reading symbols from /usr/local/xscale_be/target/lib/libpthread.so.0...done.
Loaded symbols for /usr/local/xscale_be/target/lib/libpthread.so.0
Reading symbols from /usr/local/xscale_be/target/lib/ld-linux.so.3...done.
Loaded symbols for /usr/local/xscale_be/target/lib/ld-linux.so.3
#0  0x40409580 in std::_Rb_tree_rebalance_for_erase () from /usr/local/xscale_be/target/usr/lib/libstdc++.so.6
(gdb) backtrace
#0  0x40409580 in std::_Rb_tree_rebalance_for_erase () from /usr/local/xscale_be/target/usr/lib/libstdc++.so.6
#1  0x4062d1c4 in nullserv () from /usr/local/xscale_be/target/lib/libc.so.6
#2  0x4062d1c4 in nullserv () from /usr/local/xscale_be/target/lib/libc.so.6
</code></pre>
<p>Besten Dank schon im Voraus für eure Hilfe &amp; Greeetz<br />
Kessi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/215329/mysteriöser-segmentation-fault</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 09:45:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/215329.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 09 Jun 2008 15:46:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to mysteriöser Segmentation Fault on Mon, 09 Jun 2008 15:46:19 GMT]]></title><description><![CDATA[<p>Hi everyone</p>
<p>Folgendes Problem: in meiner main()-Methode kopiere ich alle Argumente in einen Vektor und geben den an meine eigentlich (public static) main-Methode in meiner Hauptklasse weiter.</p>
<p>Das mache ich in jedem Programm so und es hat noch nie Probleme verursacht. Aber in diesem Fall erhalte ich nach der (korrekten) Ausführung des ganzen Programms einen Segmentation Fault. Das ist darum lästig, weil ich das Programm als via CGI aufrufen wollte und mein Webserver die Ausgabe nicht anzeigt, wenn ein Fehler aufgetreten ist.</p>
<p>Der Code dazu sieht wie folgt aus:</p>
<pre><code class="language-cpp">#include &quot;EwbConfig.h&quot;
#include &lt;iostream&gt;

using namespace ewbconfig;
using namespace std;

int main(int argc, const char *argv[]) {
    vector&lt;string&gt; args(argc);
    copy(argv, &amp;argv[argc], args.begin());

    int i = EwbConfig::main(args);
    cout &lt;&lt; &quot;everything destructed&quot; &lt;&lt; endl;
    return i;
}
</code></pre>
<p>Erst dachte ich, es könne sich nur um Fehler beim Destruieren meiner Objekte handeln, deshalb habe ich den cout ganz am Ende eingefügt (der noch vor dem SegFault angezeigt wird). Da es sich um eine static-Methode handelt wird nach dem cout sicher keine meiner Klassen mehr destruiert, sondern nur noch der vector. Anschliessend wird nur noch i zurückgegeben (=0, EwbConfig::main() gibt immer 0 zurück).</p>
<p>Wo um Himmels Willen kann da also noch ein Segmentation Fault entstehen? Man beachte, dass args als const-Reference übergeben wird.</p>
<p>Ich habe via gdb das entstandene core-File angesehen und folgenden backtrace erhalten:</p>
<pre><code>GNU gdb 6.3 (MontaVista 6.3-20.0.22.0501131 2005-07-23)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type &quot;show copying&quot; to see the conditions.
There is absolutely no warranty for GDB.  Type &quot;show warranty&quot; for details.
This GDB was configured as &quot;--host=i686-pc-linux-gnu --target=armv5teb-montavista-linuxeabi&quot;...
Core was generated by `./ewbconfig.exe'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /usr/local/xscale_be/target/lib/libewbmeter.so...done.
Loaded symbols for /usr/local/xscale_be/target/lib/libewbmeter.so
Reading symbols from /usr/local/xscale_be/target/usr/lib/libstdc++.so.6...done.
Loaded symbols for /usr/local/xscale_be/target/usr/lib/libstdc++.so.6
Reading symbols from /usr/local/xscale_be/target/lib/libm.so.6...done.
Loaded symbols for /usr/local/xscale_be/target/lib/libm.so.6
Reading symbols from /usr/local/xscale_be/target/lib/libgcc_s.so.1...done.
Loaded symbols for /usr/local/xscale_be/target/lib/libgcc_s.so.1
Reading symbols from /usr/local/xscale_be/target/lib/libc.so.6...done.
Loaded symbols for /usr/local/xscale_be/target/lib/libc.so.6
Reading symbols from /usr/local/xscale_be/target/lib/libpthread.so.0...done.
Loaded symbols for /usr/local/xscale_be/target/lib/libpthread.so.0
Reading symbols from /usr/local/xscale_be/target/lib/ld-linux.so.3...done.
Loaded symbols for /usr/local/xscale_be/target/lib/ld-linux.so.3
#0  0x40409580 in std::_Rb_tree_rebalance_for_erase () from /usr/local/xscale_be/target/usr/lib/libstdc++.so.6
(gdb) backtrace
#0  0x40409580 in std::_Rb_tree_rebalance_for_erase () from /usr/local/xscale_be/target/usr/lib/libstdc++.so.6
#1  0x4062d1c4 in nullserv () from /usr/local/xscale_be/target/lib/libc.so.6
#2  0x4062d1c4 in nullserv () from /usr/local/xscale_be/target/lib/libc.so.6
</code></pre>
<p>Besten Dank schon im Voraus für eure Hilfe &amp; Greeetz<br />
Kessi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525826</guid><dc:creator><![CDATA[KessiMC]]></dc:creator><pubDate>Mon, 09 Jun 2008 15:46:19 GMT</pubDate></item><item><title><![CDATA[Reply to mysteriöser Segmentation Fault on Mon, 09 Jun 2008 17:20:55 GMT]]></title><description><![CDATA[<p>Dein Vector ist zu klein, nämlich leer. Entweder Du verwendest vor dem Einfügen 'resize' oder beim Kopieren einen 'back_inserter'. Außerdem kopierst Du ein Element zuwenig. Besser:</p>
<pre><code class="language-cpp">copy(argv, argv + argc, vec.begin());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1525909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525909</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Mon, 09 Jun 2008 17:20:55 GMT</pubDate></item><item><title><![CDATA[Reply to mysteriöser Segmentation Fault on Mon, 09 Jun 2008 17:25:15 GMT]]></title><description><![CDATA[<p>Sorry, verlesen <strong>und</strong> GDB-Trace ignoriert. Also, da der Fehler in einer Rot-Schwarz-Baum-Methode auftritt würde ich vermuten, dass er irgendwo in std::map ausgelöst wird. Mit Deinem Code sollte das nichts zu tun haben, abgesehen davon, dass Du nach wie vor ein Element zuwenig kopierst. Vielleicht steht dort ein erwarteter Parameter?</p>
<p>Wäre dann aber ein böses Programm. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525914</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Mon, 09 Jun 2008 17:25:15 GMT</pubDate></item><item><title><![CDATA[Reply to mysteriöser Segmentation Fault on Tue, 10 Jun 2008 12:33:03 GMT]]></title><description><![CDATA[<p>Hi again</p>
<p>Danke für die Antworten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> .</p>
<pre><code class="language-cpp">copy(argv, &amp;argv[argc], args.begin());
</code></pre>
<p>entspricht in seiner Funktion allerdings genau</p>
<pre><code class="language-cpp">copy(argv, argv + argc, vec.begin());
</code></pre>
<p>&amp;argv[argc] zeigt ja, ebenso wie argv + argc, genau hinter das letzte Element. Nur dass ich mir bei ersterem keine Gedanken um sizeof(char <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title="*)"
      alt="😉"
    /> machen muss <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> .</p>
<p>Andererseits fällt mir auf, dass ich bei ersterem evtl. erst auf einen nicht alloziierten Speicher zugreife, ehe ich einen Pointer daraus mache:</p>
<pre><code class="language-cpp">&amp;(argv[argc])
</code></pre>
<p>Wenn das ein Bereich ist, in dem ich nicht lesen darf, schmiert mein Programm schon mal per se ab. Muss ich gleich korrigieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> .</p>
<p>Was das eigentliche Problem mit dem Segmentation Fault angeht: Mein Programm verwendet eine shared library, bei der zum Teil gewisse Objektdateien bereits in der Library waren und trotzdem noch beim Linken des Programms statisch gelinkt wurden.</p>
<p>Während das für minGW kein Problem darstellt, war das Resultat bei cygwin halt ein Crash nach der eigentlichen Programmausführung. Naja.</p>
<p>Diese Unschönheit ist jetzt jedenfalls behoben und es scheint vorerst zu funktionieren.</p>
<p>Thx again &amp; greeetz<br />
Kessi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526344</guid><dc:creator><![CDATA[KessiMC]]></dc:creator><pubDate>Tue, 10 Jun 2008 12:33:03 GMT</pubDate></item><item><title><![CDATA[Reply to mysteriöser Segmentation Fault on Tue, 10 Jun 2008 12:52:48 GMT]]></title><description><![CDATA[<p>Hi Kessi,</p>
<p>vorab ne Entschuldigung, irgendwie war ich beim Beantworten ein wenig von der Rolle und habe im großen und ganzen nur Mist geschrieben.</p>
<p>KessiMC schrieb:</p>
<blockquote>
<pre><code class="language-cpp">copy(argv, &amp;argv[argc], args.begin());
</code></pre>
<p>entspricht in seiner Funktion allerdings genau</p>
<pre><code class="language-cpp">copy(argv, argv + argc, vec.begin());
</code></pre>
</blockquote>
<p>Du hast natürlich recht.</p>
<blockquote>
<p>Andererseits fällt mir auf, dass ich bei ersterem evtl. erst auf einen nicht alloziierten Speicher zugreife, ehe ich einen Pointer daraus mache:</p>
</blockquote>
<p>Richtig, das ist in der Tat undefiniertes Verhalten, und bringt zumindest auf einem mir bekannten Compiler (Visual Studio) manchmal einen Absturz, bzw. wird vom Debugger als fehlerhafter Speicherzugriff erkannt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526368</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Tue, 10 Jun 2008 12:52:48 GMT</pubDate></item><item><title><![CDATA[Reply to mysteriöser Segmentation Fault on Tue, 10 Jun 2008 13:02:40 GMT]]></title><description><![CDATA[<p>KessiMC schrieb:</p>
<blockquote>
<p>Andererseits fällt mir auf, dass ich bei ersterem evtl. erst auf einen nicht alloziierten Speicher zugreife, ehe ich einen Pointer daraus mache:</p>
<pre><code class="language-cpp">&amp;(argv[argc])
</code></pre>
<p>Wenn das ein Bereich ist, in dem ich nicht lesen darf, schmiert mein Programm schon mal per se ab. Muss ich gleich korrigieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> .</p>
</blockquote>
<p>Formal wäre es gegenwärtig undefiniert, unmittelbar hinter dem letzten Element eines Arrays zuzugreifen, um einen Zeiger darauf zu bilden. Es besteht allerdings Einigkeit im beiden Standardkomitees (C und C++), dass diese Art des Zugriffs erlaubt sein soll, die nächsten Standards werden das reflektieren; außer vielleicht auf exotischen Plattformen oder mit paranoiden Validierungstools dürfte auch heute kein praktisches Problem bestehen. Im Übrigen besteht das Problem hier sowieso nicht: das Array, in das argv zeigt, enthält tatsächlich argc+1 Zeiger, der Letzte zeigt auf einen String der Länge 0.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526376</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 10 Jun 2008 13:02:40 GMT</pubDate></item></channel></rss>