<?xml version="1.0" encoding="utf-8"?>
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" type="topic" id="faq" xml:lang="de">

    <info>
      <link type="guide" xref="index#faq"/>
    
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
      <mal:name>Mario Blättermann</mal:name>
      <mal:email>mario.blaettermann@gmail.com</mal:email>
      <mal:years>2016</mal:years>
    </mal:credit>
  
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
      <mal:name>Tim Sabsch</mal:name>
      <mal:email>tim@sabsch.com</mal:email>
      <mal:years>2018</mal:years>
    </mal:credit>
  
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
      <mal:name>Christian Kirbach</mal:name>
      <mal:email>christian.kirbach@gmail.com</mal:email>
      <mal:years>2018, 2024</mal:years>
    </mal:credit>
  
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
      <mal:name>Jürgen Benvenuti</mal:name>
      <mal:email>gastornis@posteo.org</mal:email>
      <mal:years>2023, 2024</mal:years>
    </mal:credit>
  </info>
    <title>Was bedeutet »heap«?</title>

    <section id="what-does-heap-mean">
      <title>Was bedeutet »In file [heap]«?</title>

      <p>Das bedeutet, dass Sysprof glaubt, eine Funktion wurde von irgendwo im Heap des Programms (wo <code>malloc</code> Speicher zuweist) statt im Codebereich (wo sich ausführbarer Code normalerweise befindet) aufgerufen. Dafür gibt es mehrere mögliche Erklärungen.</p>
    </section>

    <section id="jit">
      <title>Just-in-Time-Compiler (JIT)</title>

      <p>Sprachen wie Java können ausführbaren Code zur Laufzeit generieren und ihn in den Heap abspeichern. Sysprof erfasst die Situation in diesem Fall korrekt.</p>
    </section>

    <section id="optimizing">
      <title>Compiler-Optimierung</title>

      <p>Compiler für C und C++ können Informationen, die zur Bestimmung des Aufrufers einer Funktion benötigt werden, wegoptimieren. Dadurch wird er fälschlicherweise als [heap] identifiziert. Sie können dennoch erkennen, wie oft jede Funktion vom Programm aufgerufen wird, nur nicht immer woher.</p>

      <note>
        <p>Für gcc verhindert die Flagge <code>-fno-omit-frame-pointer</code> diese Optimierung. Die Flagge ist nicht immer erforderlich: Auf x86_64-Rechnern beispielsweise wird sie nur mit der -O3-Optimierung benötigt.</p>
      </note>

      <note>
        <p>Um den detailliertesten und akkuratesten Aufrufbaum aus nicht-optimiertem Code zu erhalten, verwenden Sie diese Flaggen: <code>-ggdb -fno-omit-frame-pointer -O0</code></p>
      </note>
    </section>
</page>
