diff --git a/Database/AthenaPOOL/AthenaPoolCnvSvc/src/TPCnvElt.cxx b/Database/AthenaPOOL/AthenaPoolCnvSvc/src/TPCnvElt.cxx index 5bdf2bf5062212699007183133cf065f4f25c187..3902f42b2b6719afa94ea4baa2d955c02c781beb 100644 --- a/Database/AthenaPOOL/AthenaPoolCnvSvc/src/TPCnvElt.cxx +++ b/Database/AthenaPOOL/AthenaPoolCnvSvc/src/TPCnvElt.cxx @@ -1,8 +1,6 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ - -// $Id$ /** * @file AthenaPoolCnvSvc/src/TPCnvElt.cxx * @author scott snyder <snyder@bnl.gov> @@ -15,6 +13,10 @@ #include "AthenaPoolCnvSvc/exceptions.h" #include "StorageSvc/DbReflex.h" +#include "AthenaKernel/getMessageSvc.h" +#include "GaudiKernel/MsgStream.h" +#include "GaudiKernel/System.h" + namespace AthenaPoolCnvSvc { @@ -28,7 +30,96 @@ namespace AthenaPoolCnvSvc { Guid guidFromTypeinfo (const std::type_info& ti) { pool::TypeH typ = pool::DbReflex::forTypeInfo (ti); - if (!typ) throwExcNoDictForClass (ti); + if (!typ) { + // Print additional diagnostic information here to try to get a better + // handle on why this is happening. + // See ATEAM-697. + std::string clname = System::typeinfoName (ti); + MsgStream msg (Athena::getMessageSvc(), "TPCnvElt"); + msg << MSG::ERROR << "Cannot find full dictionary information for class " << + clname << endmsg; + TClass* cls = static_cast<TClass*>(typ); + if (!cls) { + msg << MSG::ERROR << "No TClass; trying to retrieve again." << endmsg; + cls = TClass::GetClass (ti); + if (!cls) { + msg << MSG::ERROR << "Couldn't retrieve via type_info; try by name." << endmsg; + cls = TClass::GetClass (clname.c_str()); + } + } + if (cls) { + msg << MSG::ERROR << "Got TClass " << cls->GetName() << " " << + cls->HasInterpreterInfoInMemory() << " " << + cls->HasInterpreterInfo() << " " << + cls->GetState() << " " << + cls->HasDictionary() << " " << + cls->IsLoaded() << " " << + cls->IsForeign() << endmsg; + + TClass* cls2 = TClass::GetClass (ti); + if (cls2) { + msg << MSG::ERROR << "Got TClass by ti " << cls2->GetName() << " " << + (cls == cls2) << " " << + cls2->HasInterpreterInfoInMemory() << " " << + cls2->HasInterpreterInfo() << " " << + cls2->GetState() << " " << + cls2->HasDictionary() << " " << + cls2->IsLoaded() << " " << + cls2->IsForeign() << endmsg; + } + else { + msg << MSG::ERROR << "Could not re-get class by ti" << endmsg; + } + + cls2 = TClass::GetClass (clname.c_str()); + if (cls2) { + msg << MSG::ERROR << "Got TClass by name " << cls2->GetName() << " " << + (cls == cls2) << " " << + cls2->HasInterpreterInfoInMemory() << " " << + cls2->HasInterpreterInfo() << " " << + cls2->GetState() << " " << + cls2->HasDictionary() << " " << + cls2->IsLoaded() << " " << + cls2->IsForeign() << endmsg; + } + else { + msg << MSG::ERROR << "Could not re-get class by name" << endmsg; + } + + sleep (10); + + cls2 = TClass::GetClass (ti); + if (cls2) { + msg << MSG::ERROR << "Got TClass by ti " << cls2->GetName() << " " << + (cls == cls2) << " " << + cls2->HasInterpreterInfoInMemory() << " " << + cls2->HasInterpreterInfo() << " " << + cls2->GetState() << " " << + cls2->HasDictionary() << " " << + cls2->IsLoaded() << " " << + cls2->IsForeign() << endmsg; + } + else { + msg << MSG::ERROR << "Could not re-get class by ti" << endmsg; + } + + cls2 = TClass::GetClass (clname.c_str()); + if (cls2) { + msg << MSG::ERROR << "Got TClass by name " << cls2->GetName() << " " << + (cls == cls2) << " " << + cls2->HasInterpreterInfoInMemory() << " " << + cls2->HasInterpreterInfo() << " " << + cls2->GetState() << " " << + cls2->HasDictionary() << " " << + cls2->IsLoaded() << " " << + cls2->IsForeign() << endmsg; + } + else { + msg << MSG::ERROR << "Could not re-get class by name" << endmsg; + } + } + throwExcNoDictForClass (ti); + } return pool::DbReflex::guid (typ); }