eBPF 已成为轻松快速地监控流程的重要工具。然而,我无法找到如何计算探针本身对性能的影响。我确信如果我挂钩每个系统调用并在地图中推送一些信息,一定会产生一些影响,没有什么是免费的,但是我将如何正确计算这种增加的延迟?
我想到的唯一解决方案是在探测器处于活动状态和不活动状态的情况下多次运行相同的程序,并检查系统执行时间差异,但在我看来,这会受到各种因素的影响,这些因素可能会增加很多差异因此不会给出非常可靠的结果。
我正在尝试构建一个简单的属性,它将在函数的开头注入一个 let 绑定,因此结果将是:
#[foo]
fn bar(){
// start injected code
let x = 0;
// end injected code
...
}
Run Code Online (Sandbox Code Playgroud)
我已经做到了:
use proc_macro::TokenStream;
use quote::{quote, ToTokens};
use syn::{parse_macro_input, ItemFn, Item, Stmt};
#[proc_macro_attribute]
pub fn hello(attr: TokenStream, stream: TokenStream) -> TokenStream {
let input = parse_macro_input!(stream as ItemFn);
let block = input.block;
let res = quote! {let x = 1;};
// doesn't work, can't convert TokenStream into Stmt
block.stmts.insert(0, res.into());
TokenStream::from(input.into_token_stream())
}
Run Code Online (Sandbox Code Playgroud)
但是,我在处理这些物品时遇到了麻烦。例如,blockis 类型,现在一个语句由 ( , , )Vec<Stmt> …
我正在使用 unirest 来获得 camfind 结果。
完整的错误日志:
04-14 18:24:39.574 1880-2300/projectco.project E/AndroidRuntime? FATAL EXCEPTION: Thread-120
Process: projectco.project, PID: 1880
java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/naming/ldap/LdapName;
at com.mashape.relocation.conn.ssl.AbstractVerifier.extractCNs(AbstractVerifier.java:277)
at com.mashape.relocation.conn.ssl.AbstractVerifier.getCNs(AbstractVerifier.java:265)
at com.mashape.relocation.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:157)
at com.mashape.relocation.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:140)
Run Code Online (Sandbox Code Playgroud)
[...] 更多“在”
at bookshotco.bookshot2.MainActivity$1.run(MainActivity.java:100)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.ClassNotFoundException: Didn't find class "javax.naming.ldap.LdapName" on path: DexPathList[[zip file "/data/app/projectco.project-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
Run Code Online (Sandbox Code Playgroud)
[..]
Suppressed: java.lang.ClassNotFoundException: javax.naming.ldap.LdapName
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 23 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取在字典中插入的第一个项目(尚未重新排序)。例如:
_dict = {'a':1, 'b':2, 'c':3}
Run Code Online (Sandbox Code Playgroud)
我想得到元组('a',1)
我怎样才能做到这一点?
我正在使用具有回调函数机制的板条箱。回调是用户定义的,但具有不允许传递其他值的特定签名。例如:
fn callback(id: u32, value: u32) -> u32;
// and would be used as such
library_function(callback);
Run Code Online (Sandbox Code Playgroud)
因此,如果我只需要保存到文件或打印,那么这会很好,但是我需要将值保存到向量中。例如,我会在 Python 中使用带有“预定义”参数的 lambda:
def mycallback(predefined, id, value)
# and calling it as such
predefined = []
library_function(lambda *args: mycallback(predifined, *args)
Run Code Online (Sandbox Code Playgroud)
该解决方案可能涉及 Rust 的其他技巧,但是它不能每次都写入文件,因为这似乎是一个太大的性能问题。
我正在尝试尽可能多地优化对u32来自u8. 因此,我正在测试不同的选项(for 循环、迭代器、使用 ByteOrder crate 等)作为这些测试的一部分,我还想检查是否可以使用from_raw_parts标准函数改进它。这是我的代码:
use byteorder::{ByteOrder, BigEndian, LittleEndian};
use std::io::Read;
fn main(){
let random_bytes = (0..4).map(|_| { rand::random::<u8>() }).collect::<Vec<u8>>();
let random_bytes = random_bytes.as_slice();
let view = &random_bytes as *const _ as *const u32;
let slice: &[u32] = unsafe { std::slice::from_raw_parts(view, 1) };
println!("{:x?}", slice);
println!("{:x?}", LittleEndian::read_u32(&random_bytes[0..4]));
println!("{:x?}", BigEndian::read_u32(&random_bytes[0..4]));
println!("{:x?}", &random_bytes[0..4]);
}
Run Code Online (Sandbox Code Playgroud)
我本来希望两个小端或大端中的至少一个等于第一个打印,但事实并非如此,例如示例输出
[d951db30]
143600ff
ff003614
[ff, 0, 36, 14]
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
rust ×3
android ×1
arguments ×1
bpf ×1
closures ×1
dictionary ×1
ebpf ×1
endianness ×1
function ×1
java ×1
lambda ×1
memory ×1
monitoring ×1
performance ×1
python ×1
rust-macros ×1
unirest ×1
unsafe ×1