C ++ находит, откуда вызывается функция, чтобы найти ошибку проверки диапазона векторов

Я столкнулся с ошибкой проверки диапазона из вектора, в котором у меня возникла проблема с указанием булавки. Я работаю в ОЧЕНЬ большой среде C ++, которая на самом деле не очень хорошо разработана. Python используется в качестве пользовательского интерфейса, который затем вызывает функции / классы c ++ для выполнения всей тяжелой работы. Таким образом, настоящая команда, которую я запускаю, это «python thing.py —option1 и т. Д.» Есть функция, которая возвращает объект, который она находит по индексу в векторе. Есть два вектора, которые он может использовать в зависимости от установленного параметра bool. Чтобы быть более конкретным, у меня есть что-то вроде:

object getObject(int i, bool trig=false){
if(trig) return vector1.at(i);
return vector2.at(i);
}

Проблема в том, что векторы будут иметь разную длину, поэтому, если вы либо дадите ему неправильный индекс, либо забудете установить значение «trig», то есть большая вероятность, что вы выйдете за пределы допустимого диапазона. Эта функция или что-то в этом роде вызывается тысячи раз в разных файлах, поэтому я не могу найти, откуда на самом деле происходит ошибка проверки диапазона. В настоящее время я либо комментирую блоки кода, либо выкладываю распечатки, чтобы попытаться выяснить, где находится код до его сбоя, но это оказывается довольно сложно, учитывая количество мест, в которых мне приходится это делать.

Есть ли простой способ распечатать, откуда была вызвана эта функция, когда я получаю ошибку проверки диапазона? След стека или что-то в этом роде? Я не очень знаком с такими вещами.

Обновить:
Я пытался использовать GDB с такой командой:

gdb -ex  r --args python fakes.py --datasets data --dir outdir

Я вижу ту же ошибку, которую я всегда получаю, которая выглядит так:

Traceback (most recent call last):
File "fakes.py", line 299, in <module>
main(options,args)
File "fakes.py", line 240, in main
driver.submit(job, submitDir)
Exception: void EL::Driver::submit(const EL::Job& job,
const string& location) =>
DataVector::at range check (C++ exception)

Затем он бросает меня в командную строку GDB. Если я набираю bt (что кажется правильной командой для получения трассировки стека), я получаю сообщение «Нет стека».

Я тоже пытался запустить Valgrind с этой командой, но я не вижу в ней ничего полезного. Я мог бы просто что-то упустить, так как я новичок в valgrind. Ниже приведен вывод valgrind, где появляется ошибка:

==344722== Conditional jump or move depends on uninitialised value(s)
==344722==    at 0xE80FEC5: TObject::~TObject() (in /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.12-x86_64-slc6-gcc49-opt/lib/libCore.so)
==344722==    by 0x25437C52: EL::Driver::submitOnly(EL::Job const&, std::string const&) const (Driver.cxx:103)
==344722==    by 0x25437F88: EL::Driver::submit(EL::Job const&, std::string const&) const (Driver.cxx:84)
==344722==    by 0x1CA83031: ???
==344722==    by 0xFFE6F7E: TClingCallFunc::exec(void*, void*) const (in /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.12-x86_64-slc6-gcc49-opt/lib/libCling.so)
==344722==    by 0xD1AA1AE: PyROOT::TVoidExecutor::Execute(long, void*, PyROOT::TCallContext*) (in /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.12-x86_64-slc6-gcc49-opt/lib/libPyROOT.so)
==344722==    by 0xD1CB0CB: PyROOT::TMethodHolder::CallSafe(void*, long, PyROOT::TCallContext*) (in /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.12-x86_64-slc6-gcc49-opt/lib/libPyROOT.so)
==344722==    by 0xD1C9DB9: PyROOT::TMethodHolder::Execute(void*, long, PyROOT::TCallContext*) (in /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.12-x86_64-slc6-gcc49-opt/lib/libPyROOT.so)
==344722==    by 0xD1C8A24: PyROOT::TMethodHolder::Call(PyROOT::ObjectProxy*, _object*, _object*, PyROOT::TCallContext*) (in /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.12-x86_64-slc6-gcc49-opt/lib/libPyROOT.so)
==344722==    by 0xD1E35A4: PyROOT::(anonymous namespace)::mp_call(PyROOT::MethodProxy*, _object*, _object*) (in /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.12-x86_64-slc6-gcc49-opt/lib/libPyROOT.so)
==344722==    by 0x4C61B62: PyObject_Call (abstract.c:2529)
==344722==    by 0x4D161AD: PyEval_EvalFrameEx (ceval.c:4251)
==344722==
Traceback (most recent call last):
File "fakes.py", line 299, in <module>
main(options,args)
File "fakes.py", line 240, in main
driver.submit(job, submitDir)
Exception: void EL::Driver::submit(const EL::Job& job, const string& location) =>
DataVector::at range check (C++ exception)
==344722== Invalid read of size 4
==344722==    at 0x4CB08F3: PyObject_Free (obmalloc.c:994)
==344722==    by 0x4D55452: collect (gcmodule.c:821)
==344722==    by 0x4D55D27: PyGC_Collect (gcmodule.c:1440)
==344722==    by 0x4D3E018: Py_Finalize (pythonrun.c:449)
==344722==    by 0x4D53F8E: Py_Main (main.c:665)
==344722==    by 0x3038C1ED5C: (below main) (in /lib64/libc-2.12.so)
==344722==  Address 0x682d020 is 16 bytes before a block of size 48 alloc'd
==344722==    at 0x4A085FC: operator new(unsigned long) (vg_replace_malloc.c:298)
==344722==    by 0x10B7DD41: clang::ASTReader::ReadDeclContextStorage(clang::serialization::ModuleFile&, llvm::BitstreamCursor&, std::pair<unsigned long, unsigned long> const&, clang::serialization::DeclContextInfo&) (in /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.12-x86_64-slc6-gcc49-opt/lib/libCling.so)
==344722==    by 0x10BD8CCC: clang::ASTReader::ReadDeclRecord(unsigned int) (in /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.12-x86_64-slc6-gcc49-opt/lib/libCling.so)
==344722==    by 0x10B82DCC: clang::ASTReader::GetDecl(unsigned int) (in /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.12-x86_64-slc6-gcc49-opt/lib/libCling.so)
==344722==    by 0x11036DED: clang::MultiplexExternalSemaSource::GetExternalDecl(unsigned int) (in /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.12-x86_64-slc6-gcc49-opt/lib/libCling.so)
==344722==    by 0x1114F052: clang::ClassTemplateDecl::LoadLazySpecializations() const (in /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.12-x86_64-slc6-gcc49-opt/lib/libCling.so)
==344722==    by 0x1114F078: clang::ClassTemplateDecl::getSpecializations() const (in /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.12-x86_64-slc6-gcc49-opt/lib/libCling.so)
==344722==    by 0x11151209: clang::ClassTemplateDecl::findSpecialization(llvm::ArrayRef<clang::TemplateArgument>, void*&) (in /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.12-x86_64-slc6-gcc49-opt/lib/libCling.so)
==344722==    by 0x10F55800: clang::Sema::CheckTemplateIdType(clang::TemplateName, clang::SourceLocation, clang::TemplateArgumentListInfo&) (in /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.12-x86_64-slc6-gcc49-opt/lib/libCling.so)
==344722==    by 0x10FCC354: clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformTemplateSpecializationType(clang::TypeLocBuilder&, clang::TemplateSpecializationTypeLoc, clang::TemplateName) (in /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.12-x86_64-slc6-gcc49-opt/lib/libCling.so)
==344722==    by 0x10FB8805: clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&, clang::TypeLoc) (in /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.12-x86_64-slc6-gcc49-opt/lib/libCling.so)
==344722==    by 0x10FB8DFC: clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&, clang::TypeLoc) (in /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.12-x86_64-slc6-gcc49-opt/lib/libCling.so)

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector