diff options
author | Jonghyun Park <parjong@gmail.com> | 2017-08-19 00:21:56 +0900 |
---|---|---|
committer | Jan Vorlicek <janvorli@microsoft.com> | 2017-08-18 17:21:56 +0200 |
commit | c40a59ba595ced53667333b017b30f4cdd05a55f (patch) | |
tree | d66095c6a424436304516474f2429922143f9de9 /src/vm/gdbjit.cpp | |
parent | e4b2e7063d285e76243e65ba84d1d45ab60abaca (diff) | |
download | coreclr-c40a59ba595ced53667333b017b30f4cdd05a55f.tar.gz coreclr-c40a59ba595ced53667333b017b30f4cdd05a55f.tar.bz2 coreclr-c40a59ba595ced53667333b017b30f4cdd05a55f.zip |
Introduce COMPlus_GDBJitElfDump (#13448)
* Add COMPlus_GDBJitElfDump
* Fix Release build error
* Add flags in EEConfig
Diffstat (limited to 'src/vm/gdbjit.cpp')
-rw-r--r-- | src/vm/gdbjit.cpp | 48 |
1 files changed, 32 insertions, 16 deletions
diff --git a/src/vm/gdbjit.cpp b/src/vm/gdbjit.cpp index 1d0bcc8435..f5f95efd4d 100644 --- a/src/vm/gdbjit.cpp +++ b/src/vm/gdbjit.cpp @@ -17,6 +17,20 @@ __declspec(thread) bool tls_isSymReaderInProgress = false; +#ifdef _DEBUG +static void DumpElf(const char* methodName, const char *addr, size_t size) +{ + char dump[1024] = { 0, }; + + strcat(dump, methodName); + strcat(dump, ".o"); + + FILE *f = fopen(dump, "wb"); + fwrite(addr, sizeof(char), size, f); + fclose(f); +} +#endif + TypeInfoBase* GetTypeInfoFromTypeHandle(TypeHandle typeHandle, NotifyGdb::PTK_TypeInfoMap pTypeMap, @@ -2067,7 +2081,7 @@ class Elf_Builder void Finalize(void); public: - char *Export(UINT64 *len); + char *Export(size_t *len); }; Elf_Builder::Elf_Builder() @@ -2167,7 +2181,7 @@ void Elf_Builder::CloseSection() m_Curr = nullptr; } -char *Elf_Builder::Export(UINT64 *pLen) +char *Elf_Builder::Export(size_t *pLen) { unsigned int len = m_Buffer.GetPos(); const char *src = m_Buffer.GetPtr(); @@ -2473,12 +2487,27 @@ void NotifyGdb::OnMethodPrepared(MethodDesc* methodDescPtr) elfBuilder.Finalize(); + char *symfile_addr = NULL; + size_t symfile_size = 0; + + symfile_addr = elfBuilder.Export(&symfile_size); + +#ifdef _DEBUG + LPCUTF8 methodName = methodDescPtr->GetName(); + + if (g_pConfig->ShouldDumpElfOnMethod(methodName)) + { + DumpElf(methodName, symfile_addr, symfile_size); + } +#endif + /* Create GDB JIT structures */ NewHolder<jit_code_entry> jit_symbols = new jit_code_entry; /* Fill the new entry */ jit_symbols->next_entry = jit_symbols->prev_entry = 0; - jit_symbols->symfile_addr = elfBuilder.Export(&jit_symbols->symfile_size); + jit_symbols->symfile_addr = symfile_addr; + jit_symbols->symfile_size = symfile_size; /* Link into list */ jit_code_entry *head = __jit_debug_descriptor.first_entry; @@ -3266,19 +3295,6 @@ void NotifyGdb::SplitPathname(const char* path, const char*& pathName, const cha } } -#ifdef _DEBUG -void NotifyGdb::DumpElf(const char* methodName, const MemBuf& elfFile) -{ - char dump[1024]; - strcpy(dump, "./"); - strcat(dump, methodName); - strcat(dump, ".o"); - FILE *f = fopen(dump, "wb"); - fwrite(elfFile.MemPtr, sizeof(char),elfFile.MemSize, f); - fclose(f); -} -#endif - /* ELF 32bit header */ Elf32_Ehdr::Elf32_Ehdr() { |