186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// Copyright (c) 2011, Google Inc. 286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// All rights reserved. 386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// 486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// Redistribution and use in source and binary forms, with or without 586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// modification, are permitted provided that the following conditions are 686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// met: 786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// 886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// * Redistributions of source code must retain the above copyright 986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// notice, this list of conditions and the following disclaimer. 1086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// * Redistributions in binary form must reproduce the above 1186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// copyright notice, this list of conditions and the following disclaimer 1286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// in the documentation and/or other materials provided with the 1386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// distribution. 1486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// * Neither the name of Google Inc. nor the names of its 1586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// contributors may be used to endorse or promote products derived from 1686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// this software without specific prior written permission. 1786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// 1886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 3086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// elf_core_dump_unittest.cc: Unit tests for google_breakpad::ElfCoreDump. 3186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 3286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include <sys/procfs.h> 3386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 3486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include <set> 3586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include <string> 3686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 3786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include "breakpad_googletest_includes.h" 3886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include "common/linux/elf_core_dump.h" 3986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include "common/linux/memory_mapped_file.h" 4086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include "common/tests/file_utils.h" 4186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include "common/linux/tests/crash_generator.h" 424e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com#include "common/using_std_string.h" 4386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 4486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgusing google_breakpad::AutoTempDir; 4586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgusing google_breakpad::CrashGenerator; 4686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgusing google_breakpad::ElfCoreDump; 4786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgusing google_breakpad::MemoryMappedFile; 4886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgusing google_breakpad::MemoryRange; 4986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgusing google_breakpad::WriteFile; 5086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgusing std::set; 5186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 5286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgTEST(ElfCoreDumpTest, DefaultConstructor) { 5386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ElfCoreDump core; 5486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_FALSE(core.IsValid()); 5586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_EQ(NULL, core.GetHeader()); 562971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com EXPECT_EQ(0U, core.GetProgramHeaderCount()); 5786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_EQ(NULL, core.GetProgramHeader(0)); 5886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_EQ(NULL, core.GetFirstProgramHeaderOfType(PT_LOAD)); 5986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_FALSE(core.GetFirstNote().IsValid()); 6086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org} 6186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 6286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgTEST(ElfCoreDumpTest, TestElfHeader) { 6386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ElfCoreDump::Ehdr header; 6486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org memset(&header, 0, sizeof(header)); 6586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 6686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org AutoTempDir temp_dir; 6786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org string core_path = temp_dir.path() + "/core"; 6886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org const char* core_file = core_path.c_str(); 6986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org MemoryMappedFile mapped_core_file; 7086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ElfCoreDump core; 7186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 7286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header) - 1)); 73dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org ASSERT_TRUE(mapped_core_file.Map(core_file, 0)); 7486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org core.SetContent(mapped_core_file.content()); 7586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_FALSE(core.IsValid()); 7686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_EQ(NULL, core.GetHeader()); 772971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com EXPECT_EQ(0U, core.GetProgramHeaderCount()); 7886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_EQ(NULL, core.GetProgramHeader(0)); 7986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_EQ(NULL, core.GetFirstProgramHeaderOfType(PT_LOAD)); 8086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_FALSE(core.GetFirstNote().IsValid()); 8186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 8286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header))); 83dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org ASSERT_TRUE(mapped_core_file.Map(core_file, 0)); 8486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org core.SetContent(mapped_core_file.content()); 8586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_FALSE(core.IsValid()); 8686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 8786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org header.e_ident[0] = ELFMAG0; 8886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header))); 89dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org ASSERT_TRUE(mapped_core_file.Map(core_file, 0)); 9086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org core.SetContent(mapped_core_file.content()); 9186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_FALSE(core.IsValid()); 9286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 9386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org header.e_ident[1] = ELFMAG1; 9486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header))); 95dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org ASSERT_TRUE(mapped_core_file.Map(core_file, 0)); 9686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org core.SetContent(mapped_core_file.content()); 9786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_FALSE(core.IsValid()); 9886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 9986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org header.e_ident[2] = ELFMAG2; 10086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header))); 101dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org ASSERT_TRUE(mapped_core_file.Map(core_file, 0)); 10286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org core.SetContent(mapped_core_file.content()); 10386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_FALSE(core.IsValid()); 10486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 10586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org header.e_ident[3] = ELFMAG3; 10686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header))); 107dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org ASSERT_TRUE(mapped_core_file.Map(core_file, 0)); 10886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org core.SetContent(mapped_core_file.content()); 10986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_FALSE(core.IsValid()); 11086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 11186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org header.e_ident[4] = ElfCoreDump::kClass; 11286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header))); 113dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org ASSERT_TRUE(mapped_core_file.Map(core_file, 0)); 11486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org core.SetContent(mapped_core_file.content()); 11586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_FALSE(core.IsValid()); 11686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 11786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org header.e_version = EV_CURRENT; 11886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header))); 119dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org ASSERT_TRUE(mapped_core_file.Map(core_file, 0)); 12086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org core.SetContent(mapped_core_file.content()); 12186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_FALSE(core.IsValid()); 12286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 12386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org header.e_type = ET_CORE; 12486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header))); 125dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org ASSERT_TRUE(mapped_core_file.Map(core_file, 0)); 12686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org core.SetContent(mapped_core_file.content()); 12786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_TRUE(core.IsValid()); 12886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org} 12986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 13086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgTEST(ElfCoreDumpTest, ValidCoreFile) { 13186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org CrashGenerator crash_generator; 13286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org if (!crash_generator.HasDefaultCorePattern()) { 133d0765367cb68452e580bcb3531b38db822ea17f3benchan@chromium.org fprintf(stderr, "ElfCoreDumpTest.ValidCoreFile test is skipped " 134d0765367cb68452e580bcb3531b38db822ea17f3benchan@chromium.org "due to non-default core pattern"); 13586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org return; 13686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org } 13786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 13886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org const unsigned kNumOfThreads = 3; 13986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org const unsigned kCrashThread = 1; 14086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org const int kCrashSignal = SIGABRT; 141548501df371a517683d8b4d05c05b3929ad43141vapier@chromium.org ASSERT_TRUE(crash_generator.CreateChildCrash(kNumOfThreads, kCrashThread, 142548501df371a517683d8b4d05c05b3929ad43141vapier@chromium.org kCrashSignal, NULL)); 14386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org pid_t expected_crash_thread_id = crash_generator.GetThreadId(kCrashThread); 14486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org set<pid_t> expected_thread_ids; 14586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org for (unsigned i = 0; i < kNumOfThreads; ++i) { 14686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org expected_thread_ids.insert(crash_generator.GetThreadId(i)); 14786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org } 14886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 149850b8dc0f0ddab5c042ac61fecbbf493fac3c66brmcilroy@chromium.org#if defined(__ANDROID__) 150850b8dc0f0ddab5c042ac61fecbbf493fac3c66brmcilroy@chromium.org struct stat st; 151850b8dc0f0ddab5c042ac61fecbbf493fac3c66brmcilroy@chromium.org if (stat(crash_generator.GetCoreFilePath().c_str(), &st) != 0) { 152850b8dc0f0ddab5c042ac61fecbbf493fac3c66brmcilroy@chromium.org fprintf(stderr, "ElfCoreDumpTest.ValidCoreFile test is skipped " 153850b8dc0f0ddab5c042ac61fecbbf493fac3c66brmcilroy@chromium.org "due to no core file being generated"); 154850b8dc0f0ddab5c042ac61fecbbf493fac3c66brmcilroy@chromium.org return; 155850b8dc0f0ddab5c042ac61fecbbf493fac3c66brmcilroy@chromium.org } 156850b8dc0f0ddab5c042ac61fecbbf493fac3c66brmcilroy@chromium.org#endif 157850b8dc0f0ddab5c042ac61fecbbf493fac3c66brmcilroy@chromium.org 15886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org MemoryMappedFile mapped_core_file; 159dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org ASSERT_TRUE( 160dd5dd85f3795609723082a2b34f81e19b4f1679frmcilroy@chromium.org mapped_core_file.Map(crash_generator.GetCoreFilePath().c_str(), 0)); 16186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 16286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ElfCoreDump core; 16386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org core.SetContent(mapped_core_file.content()); 16486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_TRUE(core.IsValid()); 16586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 16686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Based on write_note_info() in linux/kernel/fs/binfmt_elf.c, notes are 16786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // ordered as follows (NT_PRXFPREG and NT_386_TLS are i386 specific): 16886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Thread Name Type 16986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // ------------------------------------------------------------------- 17086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // 1st thread CORE NT_PRSTATUS 17186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // process-wide CORE NT_PRPSINFO 17286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // process-wide CORE NT_AUXV 17386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // 1st thread CORE NT_FPREGSET 17486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // 1st thread LINUX NT_PRXFPREG 17586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // 1st thread LINUX NT_386_TLS 17686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // 17786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // 2nd thread CORE NT_PRSTATUS 17886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // 2nd thread CORE NT_FPREGSET 17986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // 2nd thread LINUX NT_PRXFPREG 18086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // 2nd thread LINUX NT_386_TLS 18186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // 18286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // 3rd thread CORE NT_PRSTATUS 18386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // 3rd thread CORE NT_FPREGSET 18486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // 3rd thread LINUX NT_PRXFPREG 18586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // 3rd thread LINUX NT_386_TLS 18686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 18786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org size_t num_nt_prpsinfo = 0; 18886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org size_t num_nt_prstatus = 0; 1895905ae142336d408826e28545f13d97107f0f114benchan@chromium.org size_t num_pr_fpvalid = 0; 1904ac3c240983991b6358baad732e2fbe3fd4f7245digit@chromium.org#if defined(__i386__) || defined(__x86_64__) 19186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org size_t num_nt_fpregset = 0; 1924ac3c240983991b6358baad732e2fbe3fd4f7245digit@chromium.org#endif 193b732342313268422c0c0794dfb1a82cd17ce9e05ivan.penkov@gmail.com#if defined(__i386__) 19486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org size_t num_nt_prxfpreg = 0; 195b732342313268422c0c0794dfb1a82cd17ce9e05ivan.penkov@gmail.com#endif 19686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org set<pid_t> actual_thread_ids; 19786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ElfCoreDump::Note note = core.GetFirstNote(); 19886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org while (note.IsValid()) { 19986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org MemoryRange name = note.GetName(); 20086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org MemoryRange description = note.GetDescription(); 20186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_FALSE(name.IsEmpty()); 20286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_FALSE(description.IsEmpty()); 20386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 20486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org switch (note.GetType()) { 20586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org case NT_PRPSINFO: { 20686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_TRUE(description.data() != NULL); 20786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_EQ(sizeof(elf_prpsinfo), description.length()); 20886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ++num_nt_prpsinfo; 20986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org break; 21086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org } 21186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org case NT_PRSTATUS: { 21286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_TRUE(description.data() != NULL); 21386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_EQ(sizeof(elf_prstatus), description.length()); 21486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org const elf_prstatus* status = description.GetData<elf_prstatus>(0); 21586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org actual_thread_ids.insert(status->pr_pid); 21686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org if (num_nt_prstatus == 0) { 21786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_EQ(expected_crash_thread_id, status->pr_pid); 21886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_EQ(kCrashSignal, status->pr_info.si_signo); 21986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org } 22086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ++num_nt_prstatus; 2215905ae142336d408826e28545f13d97107f0f114benchan@chromium.org if (status->pr_fpvalid) 2225905ae142336d408826e28545f13d97107f0f114benchan@chromium.org ++num_pr_fpvalid; 22386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org break; 22486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org } 225b732342313268422c0c0794dfb1a82cd17ce9e05ivan.penkov@gmail.com#if defined(__i386__) || defined(__x86_64__) 22686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org case NT_FPREGSET: { 22786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_TRUE(description.data() != NULL); 22886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_EQ(sizeof(user_fpregs_struct), description.length()); 22986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ++num_nt_fpregset; 23086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org break; 23186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org } 23286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#endif 233b732342313268422c0c0794dfb1a82cd17ce9e05ivan.penkov@gmail.com#if defined(__i386__) 23486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org case NT_PRXFPREG: { 23586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_TRUE(description.data() != NULL); 23686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_EQ(sizeof(user_fpxregs_struct), description.length()); 23786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ++num_nt_prxfpreg; 23886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org break; 23986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org } 24086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#endif 24186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org default: 24286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org break; 24386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org } 24486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org note = note.GetNextNote(); 24586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org } 24686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 24786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_TRUE(expected_thread_ids == actual_thread_ids); 2482971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com EXPECT_EQ(1U, num_nt_prpsinfo); 24986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org EXPECT_EQ(kNumOfThreads, num_nt_prstatus); 250b732342313268422c0c0794dfb1a82cd17ce9e05ivan.penkov@gmail.com#if defined(__i386__) || defined(__x86_64__) 2515905ae142336d408826e28545f13d97107f0f114benchan@chromium.org EXPECT_EQ(num_pr_fpvalid, num_nt_fpregset); 25286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#endif 253b732342313268422c0c0794dfb1a82cd17ce9e05ivan.penkov@gmail.com#if defined(__i386__) 2545905ae142336d408826e28545f13d97107f0f114benchan@chromium.org EXPECT_EQ(num_pr_fpvalid, num_nt_prxfpreg); 25586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#endif 25686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org} 257