Struct sentry_core::protocol::debugid::DebugId
source · #[repr(C, packed(1))]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§
source§impl DebugId
impl DebugId
sourcepub 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.
sourcepub 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.
sourcepub 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.
sourcepub fn from_breakpad(string: &str) -> Result<DebugId, ParseDebugIdError>
pub fn from_breakpad(string: &str) -> Result<DebugId, ParseDebugIdError>
Parses a breakpad identifier from a string.
sourcepub 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:
sourcepub 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.
sourcepub fn is_nil(&self) -> bool
pub fn is_nil(&self) -> bool
Returns whether this identifier is nil, i.e. it consists only of zeros.
sourcepub 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§
source§impl<'de> Deserialize<'de> for DebugId
impl<'de> Deserialize<'de> for DebugId
source§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>,
source§impl Ord for DebugId
impl Ord for DebugId
source§impl PartialOrd for DebugId
impl PartialOrd for DebugId
source§impl Serialize for DebugId
impl Serialize for DebugId
source§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,
impl Copy for DebugId
impl Eq for DebugId
impl StructuralPartialEq for DebugId
Auto Trait Implementations§
impl Freeze for DebugId
impl RefUnwindSafe for DebugId
impl Send for DebugId
impl Sync for DebugId
impl Unpin for DebugId
impl UnwindSafe for DebugId
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§default unsafe fn clone_to_uninit(&self, dst: *mut T)
default unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<T> CloneToUninit for Twhere
T: Copy,
impl<T> CloneToUninit for Twhere
T: Copy,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.