blob: cc0a483a98c4cf8231c66fbb53821b253bb8537d [file] [log] [blame]
//
// Copyright 2022 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// backtrace_utils.h:
// Tools to extract the backtrace from the ANGLE code during execution.
//
#ifndef COMMON_BACKTRACEUTILS_H_
#define COMMON_BACKTRACEUTILS_H_
#include <string>
#include <vector>
#include "debug.h"
#include "hash_utils.h"
namespace angle
{
// Used to store the backtrace information, such as the stack addresses and symbols.
class BacktraceInfo
{
public:
BacktraceInfo() {}
~BacktraceInfo() {}
void clear()
{
mStackAddresses.clear();
mStackSymbols.clear();
}
size_t getSize() const
{
ASSERT(mStackAddresses.size() == mStackSymbols.size());
return mStackAddresses.size();
}
std::vector<void *> getStackAddresses() const { return mStackAddresses; }
std::vector<std::string> getStackSymbols() const { return mStackSymbols; }
bool operator==(const BacktraceInfo &rhs) const
{
return mStackAddresses == rhs.mStackAddresses;
}
bool operator<(const BacktraceInfo &rhs) const { return mStackAddresses < rhs.mStackAddresses; }
void *getStackAddress(size_t index) const
{
ASSERT(index < mStackAddresses.size());
return mStackAddresses[index];
}
std::string getStackSymbol(size_t index) const
{
ASSERT(index < mStackSymbols.size());
return mStackSymbols[index];
}
size_t hash() const { return ComputeGenericHash(*this); }
// Used to add the stack addresses and their corresponding symbols to the object, when
// angle_enable_unwind_backtrace_support is enabled on Android.
void populateBacktraceInfo(void **stackAddressBuffer, size_t stackAddressCount);
private:
std::vector<void *> mStackAddresses;
std::vector<std::string> mStackSymbols;
};
// Used to obtain the stack addresses and symbols from the device, when
// angle_enable_unwind_backtrace_support is enabled on Android. Otherwise , it returns an empty
// object.
BacktraceInfo getBacktraceInfo();
// Used to print the stack addresses and symbols embedded in the BacktraceInfo object.
void printBacktraceInfo(BacktraceInfo backtraceInfo);
} // namespace angle
// Introduce std::hash for BacktraceInfo so it can be used as key for angle::HashMap.
namespace std
{
template <>
struct hash<angle::BacktraceInfo>
{
size_t operator()(const angle::BacktraceInfo &key) const { return key.hash(); }
};
} // namespace std
#endif // COMMON_BACKTRACEUTILS_H_