Предположим, у меня есть программа foo
, которую я запускаю с foo bar
. Теперь, если я запускаю его нормально, он работает нормально. Если я попытаюсь использовать:
valgrind --tool=massif foo bar
Он вылетает с повторением:
==10202== Warning: noted but unhandled ioctl 0x22 with no size/direction hints.
==10202== This could cause spurious value errors to appear.
==10202== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper.
Тогда из среды моей программы:
[foo-14] process has finished cleanly
Попытка:
valgrind --tool=massif xterm -e gdb -ex 'catch throw' -ex 'catch syscall 60' \
-ex run --args foo bar
Это прекрасно работает.
Попытка:
valgrind --trace-children=yes --tool=massif xterm -e gdb \
-ex 'catch throw' -ex 'catch syscall 60' \
-ex run --args foo bar
Это заставляет gdb
перехватывать ошибку внутри самого valgrind
:
==10875== Process terminating with default action of signal 11 (SIGSEGV)
==10875== Bad permissions for mapped region at address 0x4201000
==10875== at 0x4201000: ???
==10875== by 0x2A2C: ???
==10875== by 0x2C5E7A643044BEFF: ???
==10875== by 0x5F206F: ??? (in /usr/bin/gdb)
==10875== by 0x2A2C: ???
==10875== by 0x7DD472F: ???
==10875== by 0x7DD4CCF: ???
==10875== by 0x7CED17F: ???
==10875== by 0x49D9BD: ??? (in /usr/bin/gdb)
==10875== by 0x4A2344: ??? (in /usr/bin/gdb)
==10875== by 0x5AD512: ??? (in /usr/bin/gdb)
==10875== by 0x69DBC5: execute_command (in /usr/bin/gdb)
Наконец:
xterm -e gdb -ex 'catch throw' -ex 'catch syscall 60' \
-ex run --args valgrind --trace-children=yes --tool=massif foo bar
Дает ошибка в окне gdb
:
"/usr/bin/valgrind": not in executable format: File format not recognised
Итак, как мне лучше всего перехватить сбой при работе под valgrind
? В качестве альтернативы, есть ли альтернативный инструмент, который будет отслеживать потребление памяти с течением времени в коде C ++?