Как получить трассировку стека с номером строки для утечки памяти в Mac OS X? - PullRequest
3 голосов
/ 20 мая 2011

Мне удалось заставить инструмент Xcode leaks сообщать об утечках в моей программе Ada GCC из командной строки (добавив delay 11.0; в конце, чтобы leaks сделал свои проверки), а затем

$ export MallocStackLogging=1
$ (./foobar &)  && leaks foobar

, что приводит к (отрывку)

Process 52027: 18 nodes malloced for 2053 KB
Process 52027: 2 leaks for 32 total leaked bytes.
Leak: 0x1002000c0  size=16  zone: DefaultMallocZone_0x100175000 string '*'
        Call stack: [thread 0x7fff70bbcca0]: | start | main | _ada_foobar | __gnat_malloc | malloc | malloc_zone_malloc 
Leak: 0x1002000d0  size=16  zone: DefaultMallocZone_0x100175000 string 'T'
        Call stack: [thread 0x7fff70bbcca0]: | start | main | _ada_foobar | __gnat_malloc | malloc | malloc_zone_malloc 

, что намного лучше, чем ничего, но будет значительно улучшено с номерами строк.

Существуют ли какие-либо варианты сборки Iдолжен был использовать?Будет ли это работать лучше, если компилятор Ada (FSF GCC 4.6.0, не от Apple) был интегрирован с Xcode?

Это сборка x86_64 на 10.6.7, Xcode 3.2.6.Использование -g не имеет значения.

В стеке вызовов main - это main(), сгенерированный gnatmake, _ada_foobar - это программа Ada, в которой фактически происходит утечка.Другие кадры взяты из системы времени выполнения.

Ответы [ 2 ]

3 голосов
/ 20 мая 2011

Ну, главный вопрос здесь - какой именно у вас компилятор. Версии Gnat, которые вы получаете из ACT, поставляются со ссылкой libraray addr2line.lib, которая может использоваться для создания символьных трассировок во время выполнения.

Версии Gnat, которые вы получаете из дистрибутивов FSF, не имеют этой библиотеки. Тем не менее, есть еще программа addr2line, которая поставляется с «binutils» от Gnu. Это у вас есть в настройках Mac, верно?

Если вы введете свои шестнадцатеричные адреса в эту программу, она должна сообщить символическую информацию, которую вы хотите. Возможно, вам придется немного переформатировать вывод leaks, чтобы addr2line принял его.

2 голосов
/ 16 ноября 2011

Valgrind 3.7.0 доступен для Mac OS X;мой тест кода был

with Ada.Text_IO; use Ada.Text_IO;
procedure Leaker is
   type P is access Integer;
   procedure Inner is
      V : P;
   begin
      Put_Line ("allocating for 42");
      V := new Integer'(42);
      Put_Line ("allocating for 0");
      V := new Integer'(0);
      Put_Line ("done.");
   end Inner;
begin
   Inner;
end Leaker;

, и я набрал

valgrind --leak-check=full --dsymutil=yes ./leaker

, чтобы получить отчет, включающий

8 bytes in 2 blocks are definitely lost in loss record 2 of 9
   at 0xB823: malloc (vg_replace_malloc.c:266)
   by 0x100010CC7: __gnat_malloc (s-memory.adb:92)
   by 0x100001C7D: _ada_leaker (leaker.adb:14)
   by 0x100001BAA: main (b~leaker.adb:191)

leaker.adb:14 - вызов Inner.

...