diff --git a/blazesym b/blazesym index 976c46bc..1e1f48c1 160000 --- a/blazesym +++ b/blazesym @@ -1 +1 @@ -Subproject commit 976c46bcd06a32a99335d63932b0194fb2122dd2 +Subproject commit 1e1f48c18da9416e1d4c35ec9bce4ed77019b109 diff --git a/bpftool b/bpftool index cdd0b425..8ec897a0 160000 --- a/bpftool +++ b/bpftool @@ -1 +1 @@ -Subproject commit cdd0b425fce958e3d02424c9d0296e6d0f7e323f +Subproject commit 8ec897a0cd357fe9e13eec7d27d43e024891746b diff --git a/examples/rust/Cargo.lock b/examples/rust/Cargo.lock index e56e8125..0c9e5270 100644 --- a/examples/rust/Cargo.lock +++ b/examples/rust/Cargo.lock @@ -19,18 +19,18 @@ dependencies = [ [[package]] name = "ansi_term" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" dependencies = [ "winapi", ] [[package]] name = "anyhow" -version = "1.0.45" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee10e43ae4a853c0a3591d4e2ada1719e553be18199d9da9d4a83f5927c2f5c7" +checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" [[package]] name = "atty" @@ -45,9 +45,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "bitflags" @@ -55,6 +55,16 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "blazesym" +version = "0.1.0" +source = "git+https://github.com/ThinkerYzu1/blazesym.git#1e1f48c18da9416e1d4c35ec9bce4ed77019b109" +dependencies = [ + "cbindgen", + "nix 0.24.1", + "regex", +] + [[package]] name = "cargo-platform" version = "0.1.2" @@ -77,11 +87,30 @@ dependencies = [ "serde_json", ] +[[package]] +name = "cbindgen" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b6d248e3ca02f3fbfabcb9284464c596baec223a26d91bbf44a5a62ddb0d900" +dependencies = [ + "clap 3.1.18", + "heck 0.4.0", + "indexmap", + "log", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn", + "tempfile", + "toml", +] + [[package]] name = "cc" -version = "1.0.72" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" [[package]] name = "cfg-if" @@ -91,54 +120,91 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "2.33.3" +version = "2.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ "ansi_term", "atty", "bitflags", - "strsim", - "textwrap", + "strsim 0.8.0", + "textwrap 0.11.0", "unicode-width", "vec_map", ] +[[package]] +name = "clap" +version = "3.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" +dependencies = [ + "atty", + "bitflags", + "clap_derive", + "clap_lex", + "indexmap", + "lazy_static", + "strsim 0.10.0", + "termcolor", + "textwrap 0.15.0", +] + +[[package]] +name = "clap_derive" +version = "3.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25320346e922cffe59c0bbc5410c8d8784509efb321488971081313cb1e1a33c" +dependencies = [ + "heck 0.4.0", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" +dependencies = [ + "os_str_bytes", +] + [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] [[package]] name = "ctrlc" -version = "3.2.1" +version = "3.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19c6cedffdc8c03a3346d723eb20bd85a13362bb96dc2ac000842c6381ec7bf" +checksum = "b37feaa84e6861e00a1f5e5aa8da3ee56d605c9992d33e082786754828e20865" dependencies = [ - "nix 0.23.0", + "nix 0.24.1", "winapi", ] [[package]] -name = "derivative" -version = "2.2.0" +name = "fastrand" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" dependencies = [ - "proc-macro2", - "quote", - "syn", + "instant", ] [[package]] name = "flate2" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +checksum = "b39522e96686d38f4bc984b9198e3a0613264abaebaff2c5c918bfa6b6da09af" dependencies = [ "cfg-if", "crc32fast", @@ -147,15 +213,10 @@ dependencies = [ ] [[package]] -name = "getrandom" -version = "0.2.3" +name = "hashbrown" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" [[package]] name = "heck" @@ -166,6 +227,12 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "heck" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -175,11 +242,30 @@ dependencies = [ "libc", ] +[[package]] +name = "indexmap" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + [[package]] name = "itoa" -version = "0.4.8" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" [[package]] name = "lazy_static" @@ -201,7 +287,7 @@ dependencies = [ "regex", "scroll", "scroll_derive", - "semver 1.0.4", + "semver 1.0.9", "serde", "serde_json", "structopt", @@ -217,7 +303,7 @@ checksum = "87d1f46d8d976bba68a9b772138e2307cfd7432bf66f3e1c83b3944e83ab9002" dependencies = [ "bitflags", "libbpf-sys", - "nix 0.22.0", + "nix 0.22.3", "num_enum", "strum_macros", "thiserror", @@ -236,15 +322,24 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.107" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbe5e23404da5b4f555ef85ebed98fb4083e55a00c317800bc2a50ede9f3d219" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] [[package]] name = "memchr" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memmap2" @@ -257,28 +352,27 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" dependencies = [ "autocfg", ] [[package]] name = "miniz_oxide" -version = "0.4.4" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" dependencies = [ "adler", - "autocfg", ] [[package]] name = "nix" -version = "0.22.0" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1e25ee6b412c2a1e3fcb6a4499a5c1bfe7f43e014bdce9a6b6666e5aa2d187" +checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" dependencies = [ "bitflags", "cc", @@ -289,12 +383,11 @@ dependencies = [ [[package]] name = "nix" -version = "0.23.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f305c2c2e4c39a82f7bf0bf65fb557f9070ce06781d4f2454295cc34b1c43188" +checksum = "8f17df307904acd05aa8e32e97bb20f2a0df1728bbc2d771ae8f9a90463441e9" dependencies = [ "bitflags", - "cc", "cfg-if", "libc", "memoffset", @@ -302,19 +395,18 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.5.4" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9bd055fb730c4f8f4f57d45d35cd6b3f0980535b056dc7ff119cee6a66ed6f" +checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" dependencies = [ - "derivative", "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.5.4" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486ea01961c4a818096de679a8b740b26d9033146ac5291b1c98557658f8cdd9" +checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -332,6 +424,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "os_str_bytes" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "029d8d0b2f198229de29dca79676f2738ff952edf3fde542eb8bf94d8c21b435" + [[package]] name = "pest" version = "2.1.3" @@ -343,9 +441,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.22" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12295df4f294471248581bc09bef3c38a5e46f1e36d6a37353621a0c6c357e1f" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" [[package]] name = "plain" @@ -353,17 +451,11 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" -[[package]] -name = "ppv-lite86" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" - [[package]] name = "proc-macro-crate" -version = "1.1.0" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebace6889caf889b4d3f76becee12e90353f2b8c7d875534a71e5742f8f6f83" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" dependencies = [ "thiserror", "toml", @@ -395,76 +487,48 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.32" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43" +checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] -name = "quote" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +name = "profile" +version = "0.1.0" dependencies = [ + "blazesym", + "clap 3.1.18", + "libbpf-cargo", + "libbpf-rs", "libc", - "rand_chacha", - "rand_core", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", + "nix 0.24.1", ] [[package]] -name = "rand_core" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_hc" -version = "0.3.1" +name = "quote" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" dependencies = [ - "rand_core", + "proc-macro2", ] [[package]] name = "redox_syscall" -version = "0.2.10" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.5.4" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" dependencies = [ "aho-corasick", "memchr", @@ -473,9 +537,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.6.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" [[package]] name = "remove_dir_all" @@ -488,9 +552,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.5" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" [[package]] name = "scroll" @@ -521,9 +585,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.4" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" +checksum = "8cb243bdfdb5936c8dc3c45762a19d12ab4550cdc753bc247637d4ec35a040fd" [[package]] name = "semver-parser" @@ -536,18 +600,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.130" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.130" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" dependencies = [ "proc-macro2", "quote", @@ -556,9 +620,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.69" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e466864e431129c7e0d3476b92f20458e5879919a0596c6472738d9fa2d342f8" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" dependencies = [ "itoa", "ryu", @@ -571,13 +635,19 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "structopt" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b9788f4202aa75c240ecc9c15c65185e6a39ccdeb0fd5d008b98825464c87c" +checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" dependencies = [ - "clap", + "clap 2.34.0", "lazy_static", "structopt-derive", ] @@ -588,7 +658,7 @@ version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" dependencies = [ - "heck", + "heck 0.3.3", "proc-macro-error", "proc-macro2", "quote", @@ -601,7 +671,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec" dependencies = [ - "heck", + "heck 0.3.3", "proc-macro2", "quote", "syn", @@ -609,29 +679,38 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.81" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2afee18b8beb5a596ecb4a2dce128c719b4ba399d34126b9e4396e3f9860966" +checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "tempfile" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ "cfg-if", + "fastrand", "libc", - "rand", "redox_syscall", "remove_dir_all", "winapi", ] +[[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + [[package]] name = "textwrap" version = "0.11.0" @@ -641,20 +720,26 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "textwrap" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" + [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" dependencies = [ "proc-macro2", "quote", @@ -663,9 +748,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" dependencies = [ "serde", ] @@ -690,11 +775,17 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" +[[package]] +name = "unicode-ident" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" + [[package]] name = "unicode-segmentation" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" [[package]] name = "unicode-width" @@ -702,12 +793,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" -[[package]] -name = "unicode-xid" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" - [[package]] name = "vec_map" version = "0.8.2" @@ -716,9 +801,9 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version_check" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "vsprintf" @@ -730,12 +815,6 @@ dependencies = [ "libc", ] -[[package]] -name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" - [[package]] name = "winapi" version = "0.3.9" @@ -752,6 +831,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/examples/rust/Cargo.toml b/examples/rust/Cargo.toml index b93d8c7a..c5c4cb31 100644 --- a/examples/rust/Cargo.toml +++ b/examples/rust/Cargo.toml @@ -2,4 +2,5 @@ members = [ "tracecon", "xdp", + "profile", ] diff --git a/examples/rust/profile/.gitignore b/examples/rust/profile/.gitignore new file mode 100644 index 00000000..3a1b4489 --- /dev/null +++ b/examples/rust/profile/.gitignore @@ -0,0 +1,2 @@ +/src/bpf/.output +/target diff --git a/examples/rust/profile/Cargo.toml b/examples/rust/profile/Cargo.toml new file mode 100644 index 00000000..0aedb9ed --- /dev/null +++ b/examples/rust/profile/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "profile" +version = "0.1.0" +authors = ["Kuifeng Lee "] +license = "GPL-2.0 OR BSD-3-Clause" + +[dependencies] +libbpf-rs = "0.14.0" +nix = "0.24.1" +blazesym = { git = "https://github.com/ThinkerYzu1/blazesym.git", features = ["cheader"] } +libc = "*" +clap = { version = "3.1.18", features = ["derive"] } + +[build-dependencies] +libbpf-cargo = "0.9.3" diff --git a/examples/rust/profile/build.rs b/examples/rust/profile/build.rs new file mode 100644 index 00000000..38938b9f --- /dev/null +++ b/examples/rust/profile/build.rs @@ -0,0 +1,24 @@ +use std::fs::create_dir_all; +use std::path::Path; + +extern crate libbpf_cargo; +use libbpf_cargo::SkeletonBuilder; + +const SRC: &str = "./src/bpf/profile.bpf.c"; + +fn main() { + // It's unfortunate we cannot use `OUT_DIR` to store the generated skeleton. + // Reasons are because the generated skeleton contains compiler attributes + // that cannot be `include!()`ed via macro. And we cannot use the `#[path = "..."]` + // trick either because you cannot yet `concat!(env!("OUT_DIR"), "/skel.rs")` inside + // the path attribute either (see https://github.com/rust-lang/rust/pull/83366). + // + // However, there is hope! When the above feature stabilizes we can clean this + // all up. + create_dir_all("./src/bpf/.output").unwrap(); + let skel = Path::new("./src/bpf/.output/profile.skel.rs"); + SkeletonBuilder::new(SRC) + .generate(&skel) + .expect("bpf compilation failed"); + println!("cargo:rerun-if-changed={}", SRC); +} diff --git a/examples/rust/profile/src/bpf/profile.bpf.c b/examples/rust/profile/src/bpf/profile.bpf.c new file mode 120000 index 00000000..4a452576 --- /dev/null +++ b/examples/rust/profile/src/bpf/profile.bpf.c @@ -0,0 +1 @@ +../../../../c/profile.bpf.c \ No newline at end of file diff --git a/examples/rust/profile/src/bpf/profile.h b/examples/rust/profile/src/bpf/profile.h new file mode 120000 index 00000000..7dd13398 --- /dev/null +++ b/examples/rust/profile/src/bpf/profile.h @@ -0,0 +1 @@ +../../../../c/profile.h \ No newline at end of file diff --git a/examples/rust/profile/src/bpf/vmlinux.h b/examples/rust/profile/src/bpf/vmlinux.h new file mode 120000 index 00000000..cab453bb --- /dev/null +++ b/examples/rust/profile/src/bpf/vmlinux.h @@ -0,0 +1 @@ +../../../../../vmlinux/vmlinux.h \ No newline at end of file diff --git a/examples/rust/profile/src/main.rs b/examples/rust/profile/src/main.rs new file mode 100644 index 00000000..a9b492cc --- /dev/null +++ b/examples/rust/profile/src/main.rs @@ -0,0 +1,216 @@ +use std::u64; + +use std::boxed::Box; +use std::io::Error; +use std::mem; +use std::result::Result; +use std::time::Duration; + +extern crate nix; +use nix::unistd::close; + +extern crate libbpf_rs; + +extern crate clap; +use clap::Parser; + +#[path = "bpf/.output/profile.skel.rs"] +mod profile; +use profile::*; + +extern crate blazesym; +use blazesym::*; + +extern crate libc; + +mod syscall; + +const MAX_STACK_DEPTH: usize = 128; +const TASK_COMM_LEN: usize = 16; + +// A Rust version of stacktrace_event in profile.h +#[repr(C)] +struct stacktrace_event { + pid: u32, + cpu_id: u32, + comm: [u8; TASK_COMM_LEN], + kstack_size: i32, + ustack_size: i32, + kstack: [u64; MAX_STACK_DEPTH], + ustack: [u64; MAX_STACK_DEPTH], +} + +fn init_perf_monitor(freq: u64) -> Vec { + let nprocs = libbpf_rs::num_possible_cpus().unwrap(); + let pid = -1; + let buf: Vec = vec![0; mem::size_of::()]; + let mut attr = unsafe { + Box::::from_raw( + buf.leak().as_mut_ptr() as *mut syscall::perf_event_attr + ) + }; + attr._type = syscall::PERF_TYPE_HARDWARE; + attr.size = mem::size_of::() as u32; + attr.config = syscall::PERF_COUNT_HW_CPU_CYCLES; + attr.sample.sample_freq = freq; + attr.flags = 1 << 10; // freq = 1 + (0..nprocs) + .map(|cpu| { + let fd = syscall::perf_event_open(attr.as_ref(), pid, cpu as i32, -1, 0); + fd as i32 + }) + .collect() +} + +fn attach_perf_event( + pefds: &[i32], + prog: &mut libbpf_rs::Program, +) -> Vec> { + pefds + .iter() + .map(|pefd| prog.attach_perf_event(*pefd)) + .collect() +} + +// Pid 0 means a kernel space stack. +fn show_stack_trace(stack: &[u64], symbolizer: &BlazeSymbolizer, pid: u32) { + let cfg = if pid == 0 { + SymbolFileCfg::Kernel { + kallsyms: None, + kernel_image: None, + } + } else { + SymbolFileCfg::Process { pid: Some(pid) } + }; + + let syms = symbolizer.symbolize(&[cfg], stack); + for i in 0..stack.len() { + if syms.len() <= i || syms[i].len() == 0 { + println!(" {} [<{:016x}>]", i, stack[i]); + continue; + } + + if syms[i].len() == 1 { + let sym = &syms[i][0]; + if !sym.path.is_empty() { + println!( + " {} [<{:016x}>] {}+0x{:x} {}:{}", + i, + stack[i], + sym.symbol, + stack[i] - sym.start_address, + sym.path, + sym.line_no + ); + } else { + println!( + " {} [<{:016x}>] {}+0x{}", + i, + stack[i], + sym.symbol, + stack[i] - sym.start_address + ); + } + continue; + } + + println!(" {} [<{:016x}>]", i, stack[i]); + + for sym in &syms[i] { + if !sym.path.is_empty() { + println!( + " {}+0x{:x} {}:{}", + sym.symbol, + stack[i] - sym.start_address, + sym.path, + sym.line_no + ); + } else { + println!(" {}+0x{}", sym.symbol, stack[i] - sym.start_address); + } + } + } +} + +fn event_handler(symbolizer: &BlazeSymbolizer, data: &[u8]) -> ::std::os::raw::c_int { + if data.len() != mem::size_of::() { + eprintln!( + "Invalid size {} != {}", + data.len(), + mem::size_of::() + ); + return 1; + } + + let event = unsafe { &*(data.as_ptr() as *const stacktrace_event) }; + + if event.kstack_size <= 0 && event.ustack_size <= 0 { + return 1; + } + + let comm = std::str::from_utf8(&event.comm) + .or::(Ok("")) + .unwrap(); + println!("COMM: {} (pid={}) @ CPU {}", comm, event.pid, event.cpu_id); + + if event.kstack_size > 0 { + println!("Kernel:"); + show_stack_trace( + &event.kstack[0..(event.kstack_size as usize / mem::size_of::())], + symbolizer, + 0, + ); + } else { + println!("No Kernel Stack"); + } + + if event.ustack_size > 0 { + println!("Userspace:"); + show_stack_trace( + &event.ustack[0..(event.ustack_size as usize / mem::size_of::())], + symbolizer, + event.pid, + ); + } else { + println!("No Userspace Stack"); + } + + println!(); + 0 +} + +#[derive(Parser, Debug)] +struct Args { + /// Sampling frequency + #[clap(short, default_value_t = 1)] + freq: u64, +} + +fn main() -> Result<(), Error> { + let args = Args::parse(); + let freq = if args.freq < 1 { 1 } else { args.freq }; + + let symbolizer = BlazeSymbolizer::new()?; + + let skel_builder = ProfileSkelBuilder::default(); + let open_skel = skel_builder.open().unwrap(); + let mut skel = open_skel.load().unwrap(); + + let pefds = init_perf_monitor(freq); + let _links = attach_perf_event(&pefds, skel.progs_mut().profile()); + + let mut builder = libbpf_rs::RingBufferBuilder::new(); + builder + .add(skel.maps().events(), move |data| { + event_handler(&symbolizer, data) + }) + .unwrap(); + let ringbuf = builder.build().unwrap(); + while ringbuf.poll(Duration::MAX).is_ok() {} + + for pefd in pefds { + close(pefd)?; + } + + Ok(()) +} diff --git a/examples/rust/profile/src/syscall.rs b/examples/rust/profile/src/syscall.rs new file mode 100644 index 00000000..eb73f3b7 --- /dev/null +++ b/examples/rust/profile/src/syscall.rs @@ -0,0 +1,80 @@ +extern crate libc; + +#[repr(C)] +pub union sample_un { + pub sample_period: u64, + pub sample_freq: u64, +} + +#[repr(C)] +pub union wakeup_un { + pub wakeup_events: u32, + pub wakeup_atermark: u32, +} + +#[repr(C)] +pub union bp_1_un { + pub bp_addr: u64, + pub kprobe_func: u64, + pub uprobe_path: u64, + pub config1: u64, +} + +#[repr(C)] +pub union bp_2_un { + pub bp_len: u64, + pub kprobe_addr: u64, + pub probe_offset: u64, + pub config2: u64, +} + +#[repr(C)] +pub struct perf_event_attr { + pub _type: u32, + pub size: u32, + pub config: u64, + pub sample: sample_un, + pub sample_type: u64, + pub read_format: u64, + pub flags: u64, + pub wakeup: wakeup_un, + pub bp_type: u32, + pub bp_1: bp_1_un, + pub bp_2: bp_2_un, + pub branch_sample_type: u64, + pub sample_regs_user: u64, + pub sample_stack_user: u32, + pub clockid: i32, + pub sample_regs_intr: u64, + pub aux_watermark: u32, + pub sample_max_stack: u16, + pub __reserved_2: u16, + pub aux_sample_size: u32, + pub __reserved_3: u32, +} + +pub const PERF_TYPE_HARDWARE: u32 = 0; +pub const PERF_COUNT_HW_CPU_CYCLES: u64 = 0; + +extern "C" { + fn syscall(number: libc::c_long, ...) -> libc::c_long; +} + +pub fn perf_event_open( + hw_event: &perf_event_attr, + pid: libc::pid_t, + cpu: libc::c_int, + group_fd: libc::c_int, + flags: libc::c_ulong, +) -> libc::c_long { + unsafe { + syscall( + libc::SYS_perf_event_open, + hw_event as *const perf_event_attr, + pid, + cpu, + group_fd, + flags, + ) + } +}