1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
use serde::Deserialize;
use std::time::Duration;
#[derive(Deserialize, Debug)]
#[serde(tag="type")]
pub enum FunctionTrace {
RegisterThread(ThreadRegistration),
Call {
time: Duration,
func_name: String,
filename: String,
linenumber: u32,
},
Return {
time: Duration,
func_name: String
},
NativeCall {
time: Duration,
func_name: String,
module_name: String,
},
NativeReturn {
time: Duration,
func_name: String,
},
Exception {
time: Duration,
exception_type: String,
exception_value: String,
filename: String,
linenumber: u32,
},
Log {
time: Duration,
log_type: String,
log_value: String,
},
Import {
time: Duration,
module_name: String,
},
Allocation {
time: Duration,
details: AllocationDetails,
}
}
#[derive(Deserialize, Debug)]
#[serde(tag="type")]
pub enum AllocationDetails {
Alloc {
bytes: usize,
addr: usize,
},
Realloc {
bytes: usize,
old_addr: usize,
new_addr: usize,
},
Free {
old_addr: usize
}
}
#[derive(Deserialize, Debug)]
pub struct TraceInitialization {
pub program_name: String,
pub program_version: String,
pub lang_version: String,
pub platform: String,
pub time: Duration,
}
#[derive(Deserialize, Debug)]
pub struct ThreadRegistration {
pub time: Duration,
pub program_name: String,
pub pid: usize,
}