systemtap 追踪vfs

【Linux 系统调试】系统的动态跟踪工具--SystemTap SystemTap是一种用于Linux系统的动态跟踪工具,允许用户监控和调试运行中的内核和用户空间程序。它通过编写脚本(称为“探针”)来收集系统信息,帮助分析性能问题、调试内核模块或用户程序。编写脚本假设需要监控open运行SystemTap脚本将上述脚本保存为输出结果示例当有进程调用openSystemTap是一个功能强大的工具,能够帮助用户深入分析Linux系统的运行情况。通过编写简单的脚本,可以监控系统调用、内核函数、网络数据包等,从而快速定位和解决系统性能问题。 阅读详情

1. systemtap 提供在脚本中嵌入C代码的功能, 下面给出一个demo, 在vfs_read函数返回的时候打印访问文件的inode,以及path信息。

%{
#include <linux/sched.h>
#include <linux/fs.h>
#include <linux/dcache.h>
#include <linux/fdtable.h>
%}

function task_file_handle_d_path:string (task:long, file:long) %{
        struct task_struct *p = (struct task_struct *)((long)STAP_ARG_task);
        struct file *f = (struct file *)((long)STAP_ARG_file);
        struct files_struct *files;
        int next_fd;
        char *page = NULL;
        char *path = NULL;

        rcu_read_lock();
        files = kread(&(p->files));
        next_fd = kread(&(files->next_fd));
        STAP_PRINTF("files %p, %d\n", files, next_fd);
        if((page = (char *)__get_free_page(GFP_ATOMIC))) {
                path= d_path(&f->f_path,  page, PAGE_SIZE);
                if (path && !IS_ERR(path))
                        snprintf(STAP_RETVALUE, MAXSTRINGLEN, "%s", path);
        }
        CATCH_DEREF_FAULT();
        if (page)
                free_page((unsigned long)page);
        rcu_read_unlock();
%}

probe kernel.function("vfs_read").return {
        if (execname() != "stapio")
                task = pid2task(pid())
                printf("%s[%ld], %ld, %s\n", execname(), pid(), $file->f_inode->i_ino, task_file_handle_d_path(task, $file))
}

probe timer.s(2) {
        exit()
}

在systemtap中嵌入C代码需要开启guru模式,关键的地方:

1. 在C里面访问参数需要加STAP_ARG_这个前缀,例如获取task, 用STAP_ARG_task

2. 在C里面访问内核的数据结构需要用kread,直接访问会导致kernel panic, 例如要获取task->files->next_fd, 需要这样:

files = kread(&(p->files));

next_fd = kread(&(files->next_fd));

另外还需要启动stap需要加--suppress-handler-errors, 否则会出现下面的错误:

stap -g -v   vfs.stp 
Pass 1: parsed user script and 116 library script(s) using 211688virt/39260res/3232shr/36532data kb, in 170usr/10sys/190real ms.
Pass 2: analyzed script: 3 probe(s), 10 function(s), 5 embed(s), 0 global(s) using 246272virt/75104res/4300shr/71116data kb, in 440usr/60sys/493real ms.
Pass 3: translated to C into "/tmp/stapTBcM0A/stap_9082c9054f8c3ce472afaf44567dace1_7235_src.c" using 246272virt/75448res/4644shr/71116data kb, in 0usr/0sys/4real ms.
Pass 4: compiled C into "stap_9082c9054f8c3ce472afaf44567dace1_7235.ko" in 990usr/240sys/1162real ms.
Pass 5: starting run.
ERROR: read fault [man error::fault] at 0x0000000000000828 (((&(p->files)))) near identifier 'task_file_handle_d_path' at vfs.stp:8:10

输出demo:

tmux[5471], 1206, /dev/ptmx
files 0xffff883fcf244600, 9
sshd[136585], 1206, /dev/ptmx
files 0xffff883fce4cc600, 16
tmux[5471], 1206, /dev/ptmx
files 0xffff883fcf244600, 9
sshd[136585], 1206, /dev/ptmx
files 0xffff883fce4cc600, 17
tmux[5471], 145785, /proc/5542/cmdline

参考链接:

https://sourceware.org/systemtap/langref/Components_SystemTap_script.html

https://zhengheng.me/2015/02/11/systemtap-analy/

systemtap使用详解 详解systemtap工具的使用方法。 阅读详情

相关推荐

从0到1:.NET 9 OpenAPI全攻略!Swagger vs Scalar UI谁更强?

OpenAPI:.NET 9的智能文档革命 本文深入解析.NET 9的OpenAPI支持,对比Swagger UI与Scalar UI的优劣,提供实战代码示例: 一键生成:AddOpenApi()+MapOpenApi()快速生成标准文档 UI工具对决: Swagger UI功能全面但复杂 Scalar UI简约现代,原生支持cURL/HTTPie 进阶技巧: XML注释增强文档可读性 自定义Transformer实现文档动态修改 🔥核心价值:.NET 9的OpenAPI方案显著降低API文档维护成本,开

java专栏 1427

Linux指令:SystemTap内核跟踪和探测工具

SystemTap是一种跟踪和探测工具,它使用户可以详细研究和监视操作系统(特别是内核)的活动。它提供了类似的工具的输出信息,如netstat,ps,top,和iostat; 但是,SystemTap旨在为收集的信息提供更多的筛选和分析选项。 SystemTap是监视和跟踪正在运行的Linux内核的运行的动态方法。关键字是动态的,因为SystemTap允许您在运行时动态安装该工具,而不是使用工具构建特殊的内核。它使用称为Kprobes的应用程序编程接口(API) 进行此操作,本文将对此进行探讨。

RToax 5064

FDTD Script命令学习-farfield3d/farfieldux/farfielduy

介绍了farfield3d/farfieldux/farfielduy命令功能,及不同应用语法和参数介绍,以及对官网示例进行介绍。

jxxl_1314的博客 3097

SystemTap介绍

简介 SystemTap是一个诊断Linux系统性能或功能问题的开源软件。它使得对运行时的Linux系统进行诊断调式变得更容易、更简单。有了它,开发者或调试人员不再需要重编译、安装新内核、重启动等烦人的步骤。 为了诊断系统问题或性能,开发者或调试人员只需要写一些脚本,而且SystemTap本身也提供了很多脚本,称为”tapset”方便开发,然后通过SystemTap提供的命令行接口就可以对正在运行的内核进行诊断调试,以前需要的修改或插入调试代码、重新编译内核、安装内核和重启动等这些琐碎的工作完全消除。目前

weixin_38428439的博客 2716

量子磁场测量技术在生物磁场成像领域的应用现状与产业趋势

首先对量子磁场测量技术的发展进行了简述,然后介绍了量子磁场测量技术在生物磁场成像领域的应用,最后分析了量子磁场测量技术的两大重要应用方向(心磁图仪和脑磁图仪)及其产业现状和未来发展趋势。美国普林斯顿大学在《自然》上公布了目前人类磁场测量灵敏度最高的基于量子磁场测量技术的零场原子磁力计。拥有巨大的发展潜力及庞大的市场空间。因此其数千万元的高昂售价及每年数百万元的超导维护成本限制了超导式心磁图仪的发展和临床应用。而基于超导式脑磁图仪的癫痫、阿尔兹海默症、抑郁症等脑疾病患者的临床研究也取得丰富的研究成果。

罗伯特技术屋 1528

ESP32驱动TFT屏幕实战:LVGL与TFT_eSPI完美结合

本文详细介绍了如何在ESP32上结合TFT_eSPI驱动库与LVGL图形库,实现高效、流畅的嵌入式GUI开发。内容涵盖硬件连接、软件环境搭建、库配置、LVGL移植、界面创建及性能优化等全流程实战指南,帮助开发者快速构建低成本、高性能的交互式显示应用。

weixin_29206669的博客 200

systemtap从入门到放弃

systemtap是一个用于简化linux系统运行形态信息收集的开源工具。它立足于性能诊断和bug调试,消除了开发人员在收集数据时需要经历的繁琐和破坏性的工具、重新编译、安装和重新引导的过程。这是systemtap官方wiki给出的介绍,这里不深究它的原理,网上有个图可以清晰得展现systemtap的五脏六腑:systemtap可以动态得hook内核代码,其底层就是使用的kprobe接口。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 806

数据中心——Vxlan基本概念1

东西流量指的就是横向流量-------例如:服务器与服务器之间交换流量南北流量指的就是纵向流量-------例如:客户端和服务器之间的流量以下主要是讲解业务平面的网络架构(一般业务平面就需要用到专用的数据中心交换机)

m0_49864110的博客 1万+

SystemTap(stap)架构和原理介绍,以及脚本编写举例

SystemTap(stap)架构和原理介绍,以及脚本编写举例

Yang的博客 2845

手把手教你用STM32的SPI驱动MCP2517FD实现CAN FD通信(附完整代码)

本文详细介绍了如何使用STM32通过SPI驱动MCP2517FD实现CAN FD通信,涵盖硬件连接、SPI驱动编写、寄存器配置及数据收发实战。提供完整代码示例和常见问题排查指南,帮助开发者快速构建高可靠性的CAN FD通信系统,适用于汽车电子和工业控制等领域。

weixin_30607029的博客 674

YOLOv11改进策略【Neck】| SEAM:分离和增强注意模块,解决复杂场景下的小目标遮挡问题

本文记录的是利用 SEAM 模块优化 YOLOv11 的目标检测网络模型。的设计出发点在于解决复杂场景下的人脸遮挡问题,相当于是小目标被其他物体部分遮挡时,传统方法因特征缺失导致检测精度下降的问题。该模块通过增强未遮挡区域的特征响应并补偿被遮挡区域的信息损失,提升模型对遮挡小目标的检测能力。YOLO-FaceV2: A Scale and Occlusion Aware Face DetectorSEAM模块(Separated and Enhancement Attention Module)的设计出发点

Limiiiing的博客 2280

linux查看文件写进程,Linux下如何知道文件被那个进程写

晚上朔海同学问:一个文件正在被进程写 我想查看这个进程 文件一直在增大 找不到谁在写 使用lsof也没找到这个问题挺有普遍性的,解决方法应该很多,这里我给大家提个比较直观的方法。linux下每个文件都会在某个块设备上存放,当然也都有相应的inode, 那么透过vfs.write我们就可以知道谁在不停的写入特定的设备上的inode。幸运的是systemtap的安装包里带了inodewatch.stp...

weixin_39877898的博客 1271

在Windows10上安装WSL2

WSL2是微软提供的Windows子系统,允许在Windows 10和11上运行Linux环境,提供更好的性能和兼容性。安装WSL2需要启用WSL功能、更新系统、安装WSL2内核,并设置为默认版本。之后,可以通过Microsoft Store安装Linux发行版,并使用WSL命令启动和管理它们。

howard2005的专栏 5937

Linux 动态追踪技术深度剖析:ftrace、bpftrace 和 SystemTap

Linux 动态追踪技术深度剖析:ftrace、bpftrace 和 SystemTap

深耕嵌入式领用多年, 致力于分享嵌入式领域技术! 1303

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

使用systemtap进行内核跟踪

如果想要添加一个systemtap内核桩位,但是又不知道该插入到哪里,可以通过如下命令查看systemtap支持的所有的打点位置: stap -L '*.*' 如果想查看这些位置点一共分为哪些类别,可以对输出记过做一下归纳处理: stap -L '*.*' > list.txt awk -F '.' '{print $1}' list.txt | uniq -c | sort -rn ...

程序猿Ricky的日常干货 1621

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Linux SystemTap tool 分析

Linux SystemTap tool 分析

greenandblue的专栏 757

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Linux中使用Systemtap调试SLUB

《Linux指令:SystemTap内核跟踪和探测工具》 之前的文章曾利用systemtap的"watchpoint"功能来监测变量数值的变化,但systemtap在内核debug中的应用远不止此,本文将借由对SLUB的调试,展现systemtap的其他一些功能。 相比起近两年才出现的bpftrace,自2005年就作为RHEL 4.2中technology preview推出的systemtap算是历史悠久。伴随这么多年的发展,systemtap积累了丰富且成熟的功能,但同时它也是一个相对「重型」

RToax 1030

使用systemtap模拟坏盘

SYSTEMTAP是内核开发者必备的工具, 一种动态追踪工具。结合内核模块debuginfo,可以实现在内核函数中增加注入代码执行,从而实现模拟各种故障。SYSTEMTAP主要工作原理为: 通过stap工具将脚本语句翻译成C语句, 编译成内核模块 模块加载之后, 将所有探测的事件以钩子的方式挂到内核上, 当任何处理器上的某个事件发生时, 相应钩子上句柄就会被执行 最后,当systemtap会话结束之后,钩子从内核上取下,移除模块 st...

cyh201201的博客 1650

s-systemtap工具使用图谱(持续更新)

整体的学习思维导图如下,后续持续更新完善

天行健,地势坤 2390

Erlang/Elixir: 在Ubuntu上通过SystemTap对Erlang进行运行时的动态追踪

这一篇是 Erlang/Elixir: 在OSX上通过DTrace对Erlang进行运行时的动态追踪 在Ubuntu上的姊妹篇 SystemTap 的工作流 Ubuntu 添加 SystemTap 支持 SystemTap 是监控和跟踪运行中的Linux 内核的操作的动态方法. 这句话的关键词是动态. 因为SystemTap 没有使用工...

weixin_34233421的博客 191

systemtap系列之实用脚本

安装完systemtap相关rpm包之后,在路径/usr/share/systemtap/testsuite/systemtap.examples/或者/usr/share/doc/systemtap-client-3.0/examples/network/中有所有可实用的脚本。1.   网络查看系统中每个进程的网络传输情况:nettop.stp追踪系统中产生的网络流量。socket-trace....

badman250的专栏 1166

CentOS8安装SystemTap小记

CentOS-8.5 systemptap 安装

qq_35362055的博客 778

从SystemTap到ftrace:为什么Linux内核‘原装’的追踪工具更适合日常调试?

本文探讨了Linux内核原生追踪工具ftrace在日常调试中的优势,对比SystemTap和eBPF/BCC的设计哲学与实战表现。ftrace凭借零部署成本、低开销和崩溃免疫等特性,成为生产环境性能分析与问题排查的首选工具,特别适合需要稳定性和高效性的场景。

weixin_27741699的博客 189

别再只会用top和iostat了!手把手教你用SystemTap揪出Linux性能瓶颈

本文深入探讨了SystemTap在Linux性能瓶颈诊断中的高级应用,通过真实案例展示如何定位Java Full GC的根因。相比传统工具如top和iostat,SystemTap能深入内核函数和系统调用层面,提供精准的性能分析。文章包含实战脚本和优化指南,帮助开发者高效解决复杂性能问题。

weixin_33722405的博客 367

Meilisearch vs Elasticsearch:轻量级全文搜索的性能与落地实践

全文搜索是现代应用的基础能力,其核心在于快速、准确、低运维地返回结果。传统搜索引擎如Elasticsearch基于Lucene和JVM构建,功能强大但复杂度高;而新兴方案Meilisearch以Rust重写,聚焦单机极致性能,通过mmap内存映射、增量索引和FlatBuffers序列化实现毫秒级响应与秒级数据可见性。它并非ES的简单替代,而是面向中小规模场景(千万级文档、百并发)重新定义搜索服务——适合前端集成、SaaS产品、独立开发者等对部署简易性、API友好性和相关性可控性有强需求的用户。本文深入解析其

weixin_34121282的博客 285
上一篇: ssh agent forward
下一篇: screen lock 无密码登录
Xalloc
博客等级 码龄16年 25粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值