Struct sentry_core::protocol::debugid::DebugId
[−]#[repr(C, packed)]pub struct DebugId { /* private fields */ }
Expand description
Unique identifier for debug information files and their debug information.
This type is analogous to CodeId
, except that it identifies a debug file instead of the
actual library or executable. One some platforms, a DebugId
is an alias for a CodeId
but the
exact rules around this are complex. On Windows, the identifiers are completely different and
refer to separate files.
The string representation must be between 33 and 40 characters long and consist of:
- 36 character hyphenated hex representation of the UUID field
- 1-16 character lowercase hex representation of the u32 appendix
The debug identifier is compatible to Google Breakpad. Use DebugId::breakpad
to get a
breakpad string representation of this debug identifier.
There is one exception to this: for the old PDB 2.0 format the debug identifier consists of only a 32-bit integer + age resulting in a string representation of between 9 and 16 hex characters.
Example
use std::str::FromStr;
use debugid::DebugId;
let id = DebugId::from_str("dfb8e43a-f242-3d73-a453-aeb6a777ef75-a")?;
assert_eq!("dfb8e43a-f242-3d73-a453-aeb6a777ef75-a".to_string(), id.to_string());
In-memory representation
The in-memory representation takes up 32 bytes and can be directly written to storage and mapped back into an object reference.
use std::str::FromStr;
use debugid::DebugId;
let debug_id = DebugId::from_str("dfb8e43a-f242-3d73-a453-aeb6a777ef75-a").unwrap();
let slice = &[debug_id];
let ptr = slice.as_ptr() as *const u8;
let len = std::mem::size_of_val(slice);
let buf: &[u8] = unsafe { std::slice::from_raw_parts(ptr, len) };
let mut new_buf: Vec<u8> = Vec::new();
std::io::copy(&mut std::io::Cursor::new(buf), &mut new_buf).unwrap();
let ptr = new_buf.as_ptr() as *const DebugId;
let new_debug_id = unsafe { &*ptr };
assert_eq!(*new_debug_id, debug_id);
As long the bytes were written using the same major version of this crate you will be able to read it again like this.
Implementations
impl DebugId
impl DebugId
pub fn from_parts(uuid: Uuid, appendix: u32) -> DebugId
pub fn from_parts(uuid: Uuid, appendix: u32) -> DebugId
Constructs a DebugId
from its uuid
and appendix
parts.
pub fn from_guid_age(
guid: &[u8],
age: u32
) -> Result<DebugId, ParseDebugIdError>
pub fn from_guid_age(
guid: &[u8],
age: u32
) -> Result<DebugId, ParseDebugIdError>
Constructs a DebugId
from a Microsoft little-endian GUID and age.
pub fn from_pdb20(timestamp: u32, age: u32) -> DebugId
pub fn from_pdb20(timestamp: u32, age: u32) -> DebugId
Constructs a DebugId
from a PDB 2.0 timestamp and age.
pub fn from_breakpad(string: &str) -> Result<DebugId, ParseDebugIdError>
pub fn from_breakpad(string: &str) -> Result<DebugId, ParseDebugIdError>
Parses a breakpad identifier from a string.
pub fn uuid(&self) -> Uuid
pub fn uuid(&self) -> Uuid
Returns the UUID part of the code module’s debug_identifier.
If this is a debug identifier for the PDB 2.0 format an invalid UUID is returned
where only the first 4 bytes are filled in and the remainder of the bytes are 0.
This means the UUID has variant [uuid::Variant::NCS
] and an unknown version,
Uuid::get_version
will return None
, which is not a valid UUID.
This may seem odd however does seem reasonable:
pub fn appendix(&self) -> u32
pub fn appendix(&self) -> u32
Returns the appendix part of the code module’s debug identifier.
On Windows, this is an incrementing counter to identify the build. On all other platforms, this value will always be zero.
pub fn breakpad(&self) -> BreakpadFormat<'_>
pub fn breakpad(&self) -> BreakpadFormat<'_>
Returns a wrapper which when formatted via fmt::Display
will format a
a breakpad identifier.
Trait Implementations
impl<'de> Deserialize<'de> for DebugId
impl<'de> Deserialize<'de> for DebugId
fn deserialize<D>(
deserializer: D
) -> Result<DebugId, <D as Deserializer<'de>>::Error> where
D: Deserializer<'de>,
fn deserialize<D>(
deserializer: D
) -> Result<DebugId, <D as Deserializer<'de>>::Error> where
D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
impl FromStr for DebugId
impl FromStr for DebugId
type Err = ParseDebugIdError
type Err = ParseDebugIdError
The associated error which can be returned from parsing.
impl Ord for DebugId
impl Ord for DebugId
impl PartialOrd<DebugId> for DebugId
impl PartialOrd<DebugId> for DebugId
fn partial_cmp(&self, other: &DebugId) -> Option<Ordering>
fn partial_cmp(&self, other: &DebugId) -> Option<Ordering>
This method returns an ordering between self
and other
values if one exists. Read more
1.0.0 · sourcefn lt(&self, other: &Rhs) -> bool
fn lt(&self, other: &Rhs) -> bool
This method tests less than (for self
and other
) and is used by the <
operator. Read more
1.0.0 · sourcefn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for self
and other
) and is used by the <=
operator. Read more
impl Serialize for DebugId
impl Serialize for DebugId
fn serialize<S>(
&self,
serializer: S
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error> where
S: Serializer,
fn serialize<S>(
&self,
serializer: S
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error> where
S: Serializer,
Serialize this value into the given Serde serializer. Read more
impl Copy for DebugId
impl Eq for DebugId
impl StructuralEq for DebugId
impl StructuralPartialEq for DebugId
Auto Trait Implementations
impl RefUnwindSafe for DebugId
impl Send for DebugId
impl Sync for DebugId
impl Unpin for DebugId
impl UnwindSafe for DebugId
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more