Changeset 2212
- Timestamp:
- 09/02/21 17:06:35 (3 years ago)
- Location:
- XIOS/dev/dev_ym/XIOS_COUPLING/src
- Files:
-
- 3 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/dev_ym/XIOS_COUPLING/src/client.hpp
r1765 r2212 46 46 static CPoolRessource* getPoolRessource(void) { return poolRessource_ ; } 47 47 48 static void openStream(const StdString& fileName, const StdString& ext, std::filebuf* fb); 48 49 protected: 49 50 static int rank_; //!< Rank in model intraComm … … 51 52 static StdOFStream m_errorStream; 52 53 53 static void openStream(const StdString& fileName, const StdString& ext, std::filebuf* fb);54 54 static CPoolRessource* poolRessource_ ; 55 55 }; -
XIOS/dev/dev_ym/XIOS_COUPLING/src/cxios.cpp
r2209 r2212 14 14 #include "services_manager.hpp" 15 15 #include "servers_ressource.hpp" 16 #include "mem_checker.hpp" 16 17 17 18 namespace xios … … 155 156 156 157 #ifdef XIOS_MEMTRACK_FULL 157 MemTrack::TrackListMemoryUsage() ; 158 MemTrack::TrackDumpBlocks(); 158 report(0) << " Memory report : current memory used by XIOS : "<< MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ; 159 report(0) << " Memory report : maximum memory used by XIOS : "<< MemTrack::getMaxMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ; 160 161 ofstream memReport ; 162 std::filebuf* fb = memReport.rdbuf(); 163 CClient::openStream(clientFile, ".mem", fb); 164 165 MemTrack::TrackListMemoryUsage() ; 166 size_t memtrack_blocks=0 ; 167 memtrack_blocks=xios::CXios::getin("memtrack_blocks",memtrack_blocks) ; 168 size_t memtrack_size=0 ; 169 memtrack_size=xios::CXios::getin("memtrack_size",memtrack_size) ; 170 MemTrack::TrackDumpBlocks(memReport, memtrack_blocks,memtrack_size); 171 memReport.close(); 159 172 #endif 160 173 … … 177 190 void CXios::initServerSide(void) 178 191 { 192 CMemChecker::get("xios").resume() ; 179 193 initServer(); 180 194 isClient = false; … … 193 207 194 208 #ifdef XIOS_MEMTRACK_FULL 195 MemTrack::TrackListMemoryUsage() ; 196 MemTrack::TrackDumpBlocks(); 197 #endif 198 #endif 209 report(0) << " Memory report : current memory used by XIOS : "<< MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ; 210 report(0) << " Memory report : maximum memory used by XIOS : "<< MemTrack::getMaxMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ; 211 ofstream memReport ; 212 std::filebuf* fb = memReport.rdbuf(); 213 CClient::openStream(serverFile, ".mem", fb); 214 215 MemTrack::TrackListMemoryUsage() ; 216 size_t memtrack_blocks=0 ; 217 memtrack_blocks=xios::CXios::getin("memtrack_blocks",memtrack_blocks) ; 218 size_t memtrack_size=0 ; 219 memtrack_size=xios::CXios::getin("memtrack_size",memtrack_size) ; 220 MemTrack::TrackDumpBlocks(memReport,memtrack_blocks,memtrack_size); 221 memReport.close() ; 222 #endif 223 #endif 224 CMemChecker::get("xios").suspend() ; 225 report(0)<<CMemChecker::getAllCumulatedMem() ; 199 226 CServer::closeInfoStream(); 200 227 } -
XIOS/dev/dev_ym/XIOS_COUPLING/src/memtrack.cpp
r1158 r2212 45 45 #include <string> 46 46 #include <execinfo.h> 47 47 #include <cxxabi.h> 48 #include <dlfcn.h> 49 #include <map> 50 #include <fstream> 48 51 #include "memtrack.hpp" 52 #include "log.hpp" 53 #include "addr2line.hpp" 49 54 #undef new // IMPORTANT! 50 55 51 extern "C" 52 { 53 void addr2line(const char *file_name, char** addr, int naddr) ; 54 #ifdef XIOS_MEMTRACK_LIGHT 55 void addr2line(const char *file_name, char** addr, int naddr) {} 56 #endif 57 } 56 58 57 /* ------------------------------------------------------------ */ 59 58 /* -------------------- namespace MemTrack -------------------- */ … … 98 97 99 98 void Stamp(char const *filename, int lineNum, char const *typeName); 100 void backTrace(void) ; 101 99 void backTrace(std::ofstream& memReport, xios::CAddr2line& addr2line) ; 100 void backTrace(std::ofstream& memReport) ; 101 102 102 static void AddNode(BlockHeader *node); 103 103 static void RemoveNode(BlockHeader *node); … … 139 139 } 140 140 141 void BlockHeader::backTrace(void) 141 142 void BlockHeader::backTrace(std::ofstream& memReport) 143 { 144 char** strings ; 145 strings = backtrace_symbols(stackArray, this->stackSize); 146 int stackSize=this->stackSize-3 ; 147 char* buffer ; 148 char* outputBuffer ; 149 size_t length=10 ; 150 outputBuffer = (char*) malloc(length) ; 151 int status ; 152 Dl_info info; 153 for(int i=0;i<stackSize;i++) 154 { 155 if (dladdr(stackArray[i+3], &info)) 156 { 157 buffer=abi::__cxa_demangle(info.dli_sname,outputBuffer,&length,&status ); 158 if (buffer!=nullptr) 159 { 160 memReport<<buffer<<std::endl ; 161 outputBuffer=buffer ; 162 } 163 else if (info.dli_sname!=nullptr) memReport<<info.dli_sname<<std::endl ; 164 else memReport<<strings[i+3]<<std::endl ; 165 } 166 else memReport<<strings[i+3]<<std::endl ; 167 } 168 free(buffer) ; 169 free(strings) ; 170 } 171 172 void BlockHeader::backTrace(std::ofstream& memReport, xios::CAddr2line& addr2line) 142 173 { 143 174 144 // oss<<"addr2line -C -f -i -s -e ../bin/test_client.exe ";145 char *addr ;146 char buffer[20] ;147 addr=buffer ;148 for(int i=0;i<stackSize;i++)149 {150 std::ostringstream oss;151 oss<<stackArray[i];152 strcpy(addr,oss.str().c_str()) ;153 addr2line("/proc/self/exe",&addr,1);154 175 int stackSize=this->stackSize-3 ; 176 177 for(int i=0;i<stackSize;i++) 178 { 179 std::ostringstream address; 180 address << stackArray[i+3]; 181 addr2line.write(address.str()) ; 182 std::string out ; 183 addr2line.read(out) ; 184 memReport<<out<<std::endl ; 185 } 155 186 } 156 187 /* ---------------------------------------- BlockHeader AddNode */ … … 439 470 /* ---------------------------------------- TrackDumpBlocks */ 440 471 441 void TrackDumpBlocks( )472 void TrackDumpBlocks(std::ofstream& memReport, size_t memtrack_blocks, size_t memtrack_size ) 442 473 { 443 474 // Get an array of pointers to all extant blocks. 475 std::ostringstream ostr ; 444 476 size_t numBlocks = BlockHeader::CountBlocks(); 445 477 BlockHeader **ppBlockHeader = 446 478 (BlockHeader **)calloc(numBlocks, sizeof(*ppBlockHeader)); 447 479 BlockHeader::GetBlocks(ppBlockHeader); 448 449 480 // Dump information about the memory blocks. 450 printf("\n"); 451 printf("=====================\n"); 452 printf("Current Memory Blocks\n"); 453 printf("=====================\n"); 454 printf("\n"); 481 482 memReport<<std::endl; 483 memReport<<"=====================" <<std::endl ; 484 memReport<<"Current Memory Blocks" <<std::endl ; 485 memReport<<"=====================" <<std::endl ; 486 memReport<<std::endl ; 487 char strbuff[10000] ; 488 std::multimap<size_t,BlockHeader *,std::greater<int>> orderedBlocks ; 455 489 for (size_t i = 0; i < numBlocks; i++) 456 490 { 457 BlockHeader *pBlockHeader = ppBlockHeader[i]; 491 BlockHeader *pBlockHeader = ppBlockHeader[i]; 492 size_t size = pBlockHeader->GetRequestedSize(); 493 orderedBlocks.insert({size,pBlockHeader}) ; 494 } 495 496 xios::CAddr2line myaddr2line ; 497 size_t i = 0 ; 498 for(auto& it : orderedBlocks) 499 { 500 BlockHeader *pBlockHeader = it.second ; 458 501 char const *typeName = pBlockHeader->GetTypeName(); 459 502 size_t size = pBlockHeader->GetRequestedSize(); 460 503 char const *fileName = pBlockHeader->GetFilename(); 461 504 int lineNum = pBlockHeader->GetLineNum(); 462 printf("*** #%-6d %5d bytes %-50s\n", i, size, typeName); 463 printf("... %s:%d\n", fileName, lineNum); 464 pBlockHeader->backTrace(); 465 } 466 505 if (memtrack_blocks>0 && i>memtrack_blocks) break ; 506 if (memtrack_size>0 && size<memtrack_size) break ; 507 508 sprintf(strbuff,"*** #%-6d %5d bytes %-50s\n", i, size, typeName); 509 memReport<<strbuff ; 510 sprintf(strbuff,"... %s:%d\n", fileName, lineNum); 511 memReport<<strbuff ; 512 //pBlockHeader->backTrace(memReport, myaddr2line); 513 pBlockHeader->backTrace(memReport); 514 i++ ; 515 } 467 516 // Clean up. 468 517 free(ppBlockHeader); -
XIOS/dev/dev_ym/XIOS_COUPLING/src/memtrack.hpp
r1158 r2212 38 38 #include <typeinfo> 39 39 #include <cstring> 40 #include <fstream> 40 41 41 42 namespace MemTrack … … 59 60 void TrackFree(void *p); 60 61 void TrackStamp(void *p, const MemStamp &stamp, char const *typeName); 61 void TrackDumpBlocks( );62 void TrackDumpBlocks(std::ofstream& memReport, size_t memtrack_blocks, size_t memtrack_size); 62 63 void TrackListMemoryUsage(); 63 64 size_t getCurrentMemorySize(void) ; -
XIOS/dev/dev_ym/XIOS_COUPLING/src/server.hpp
r1765 r2212 67 67 static CServersRessource* getServersRessource(void) { return serversRessource_;} 68 68 static void launchServersRessource(MPI_Comm commServer) ; 69 static void openStream(const StdString& fileName, const StdString& ext, std::filebuf* fb); 69 70 70 71 private: … … 74 75 static StdOFStream m_infoStream; 75 76 static StdOFStream m_errorStream; 76 static void openStream(const StdString& fileName, const StdString& ext, std::filebuf* fb);77 77 static CServersRessource* serversRessource_ ; 78 78 };
Note: See TracChangeset
for help on using the changeset viewer.