1

ピンポインティングに問題があるベクトルから範囲チェックエラーが発生しています。私は非常に大規模な C++ フレームワークで作業していますが、これはあまりうまく設計されていません。Python は UI として使用され、C++ 関数/クラスを呼び出してすべての面倒な作業を行います。したがって、実際に実行するコマンドは「python thing.py --option1 etc...」です。ベクトル内のインデックスで見つかったオブジェクトを返す関数があります。設定された bool に基づいて使用できるベクトルは 2 つあります。より具体的には、次のようなものがあります。

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

問題は、ベクトルの長さが異なるため、間違ったインデックスを指定したり、'trig' bool を設定するのを忘れたりすると、範囲外になる可能性が高いことです。この関数またはそのようなものは、多くの異なるファイルで何千回も呼び出されるため、この範囲チェックエラーが実際にどこから来ているのかを見つけるのに苦労しています. 現在、コードのブロックをコメントアウトするか、印刷物を入れて、コードがクラッシュする前にコードがどこに到達するかを見つけようとしていますが、これを行う必要がある場所の数を考えると、これは非常に困難であることが証明されています.

範囲チェック エラーが発生したときに、この関数が呼び出された場所を簡単に出力する方法はありますか? スタックトレースか何か?私はこのようなことにあまり詳しくありません。

更新: 次のようなコマンドで 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)
4

0 に答える 0