Как я могу отследить/поймать "предупреждение: недопустимый дескриптор файла -1 в syscall close" в valgrind

valgrind показывает мне следующее:

==13880== Warning: invalid file descriptor -1 in syscall close()

есть ли простой способ исследовать эту ошибку? Я имею в виду-показать stack-trace, например?

это огромный проект, я не могу вручную проверить каждый элемент close. Кроме того, я думаю, что это будет одинаково для каждого вызова sys на плохом дескрипторе файла.


я запускаю его как:

valgrind --trace-children=yes --track-fds=yes --log-fd=2 --error-limit=no 
         --leak-check=full --show-possibly-lost=yes --track-origins=yes 
         --show-reachable=yes ./exe

на exe с отладочной информацией.

большая часть valgrindвывод:

==13880== Conditional jump or move depends on uninitialised value(s)
==13880==    at 0x5A4022F: ??? (in /lib/i686/cmov/libc-2.11.3.so)
==13880==    by 0x5A57323: ??? (in /lib/i686/cmov/libc-2.11.3.so)
==13880==    by 0x5A56EC2: ??? (in /lib/i686/cmov/libc-2.11.3.so)
==13880==    by 0x5A5555B: localtime_r (in /lib/i686/cmov/libc-2.11.3.so)
==13880==    by 0x754E983: ??? (in /usr/lib/libapr-1.so.0.4.2)
==13880==    by 0x754EAC9: apr_time_exp_lt (in /usr/lib/libapr-1.so.0.4.2)
==13880==    by 0x6056B56: log4cxx::helpers::TimeZoneImpl::LocalTimeZone::explode(apr_time_exp_t*, long long) const (in /usr/lib/liblog4cxx.so.10.0.0)
==13880==    by 0x6037940: log4cxx::helpers::SimpleDateFormat::format(std::string&, long long, log4cxx::helpers::Pool&) const (in /usr/lib/liblog4cxx.so.10.0.0)
==13880==    by 0x5FBE539: log4cxx::pattern::CachedDateFormat::format(std::string&, long long, log4cxx::helpers::Pool&) const (in /usr/lib/liblog4cxx.so.10.0.0)
==13880==    by 0x5FCEA2B: log4cxx::pattern::DatePatternConverter::format(log4cxx::helpers::ObjectPtrT<log4cxx::spi::LoggingEvent> const&, std::string&, log4cxx::helpers::Pool&) const (in /usr/lib/liblog4cxx.so.10.0.0)
==13880==    by 0x601EE10: log4cxx::PatternLayout::format(std::string&, log4cxx::helpers::ObjectPtrT<log4cxx::spi::LoggingEvent> const&, log4cxx::helpers::Pool&) const (in /usr/lib/liblog4cxx.so.10.0.0)
==13880==    by 0x605BCAB: log4cxx::WriterAppender::subAppend(log4cxx::helpers::ObjectPtrT<log4cxx::spi::LoggingEvent> const&, log4cxx::helpers::Pool&) (in /usr/lib/liblog4cxx.so.10.0.0)
==13880==  Uninitialised value was created by a heap allocation
==13880==    at 0x40255BC: malloc (vg_replace_malloc.c:270)
==13880==    by 0x5A57A03: ??? (in /lib/i686/cmov/libc-2.11.3.so)
==13880==    by 0x5A56D17: ??? (in /lib/i686/cmov/libc-2.11.3.so)
==13880==    by 0x5A56E20: ??? (in /lib/i686/cmov/libc-2.11.3.so)
==13880==    by 0x5A5555B: localtime_r (in /lib/i686/cmov/libc-2.11.3.so)
==13880==    by 0x754E983: ??? (in /usr/lib/libapr-1.so.0.4.2)
==13880==    by 0x754EAC9: apr_time_exp_lt (in /usr/lib/libapr-1.so.0.4.2)
==13880==    by 0x605701D: log4cxx::helpers::TimeZoneImpl::LocalTimeZone::getTimeZoneName() (in /usr/lib/liblog4cxx.so.10.0.0)
==13880==    by 0x6055D53: log4cxx::helpers::TimeZone::getDefault() (in /usr/lib/liblog4cxx.so.10.0.0)
==13880==    by 0x6038606: log4cxx::helpers::SimpleDateFormat::SimpleDateFormat(std::string const&) (in /usr/lib/liblog4cxx.so.10.0.0)
==13880==    by 0x5FCF09D: log4cxx::pattern::DatePatternConverter::getDateFormat(std::vector<std::string, std::allocator<std::string> > const&) (in /usr/lib/liblog4cxx.so.10.0.0)
==13880==    by 0x5FCF587: log4cxx::pattern::DatePatternConverter::DatePatternConverter(std::vector<std::string, std::allocator<std::string> > const&) (in /usr/lib/liblog4cxx.so.10.0.0)
==13880== 
==13880== Warning: invalid file descriptor -1 in syscall close()

пустая строка перед Warning заставляет меня думать, что stacktrace выше не имеет отношения к предупреждению. Кроме того, после Warning идет Summary, больше ничего.

2 ответов


запуск valgrind (ver.3) with-v производит также для недопустимого дескриптора файла предупреждения трассировки стека.


очевидным способом кажется: поместите точку останова в close(). Это, конечно, предполагает, что вы можете запустить свою программу в отладчике, но если вы можете запустить ее в Valgrind, это не кажется очень надуманным.