自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

认知 行动 坚持

涛哥不知何许人也,亦不详其姓字。闲静少言,不慕荣利。好读书,求甚解。常著文章自娱,颇示己志。忘怀得失,有始有终...

  • 博客(52)
  • 资源 (19)
  • 收藏
  • 关注

原创 坑踩多了的经验告诉我:能不用new/malloc就尽量不要用------今晚解决了与此相关的两个告警(小确幸)

最近有个模块有内存泄露, 非常影响后台服务质量, 用valgrind也没有分析出原因(可能是分析的时候没有泄露), 就对着代码苦苦review, 发现有个基础业务文件存在内存泄露, 是近半年改动引起的。 代码只进行了new,  但没有delete操作。        我修改了有内存泄露的代码, 发布后, 擦, 系统立即告警, 傻眼了。 绝对不可能啊, 我不就是加了delete吗? 难道不应该加

2017-03-31 00:26:08 8335 3

原创 两个cgi的莫名其妙的core dump问题的解决

在某模块, 有list和card两个cgi, 之前运行得好好的, 但经过一段时间后(期间发了对应的版本), 变得有core dump了, 两个cgi零星地core, 搞得很烦人。 去机器上打开core开关, 抓到了core, 用bt分析下, 发现栈消息没啥价值, 跟业务代码完全对不上。 自己很纳闷, 就暂时放下了这个问题, 不过, 手机上一直收到core dump告警的短信。蛋疼得很。

2017-03-31 00:04:11 104145 1

原创 今天不顺畅啊, 连续写了两个core, 我擦!------ /var/log/messages中会有segment fault提示!

早上接到一个新需求, 开搞。        下午了, 还在塞代码, 塞着塞着, 搞出一个core, 该打的log没有打出来。当时猜测是core了(因为进程号变了), 但没有core文件产生, 于是在root下看/var/log/messages信息, 果然是有segment fault错误, 然后打开linux的core开关和系统框架的core开关, 果然是有core了。 用gdb定位搞起,

2017-03-29 00:07:38 7851 3

原创 多核、多进程、多线程对应的英语分别是怎样的?

多核: multiprocessing, 意思就是多重处理, 多个cpu同时干活。        多进程: multiprogramming, 也可以近似认为是multitasking,  意思就是多道程序设计。 单个cpu并发干活, 在不同的进程间切换。        多线程: multithreading,  这个就是我们通常说的多线程, 单个cpu并发干活, 在同一个进程的线程间切换

2017-03-26 18:21:07 22972 3

原创 gdb attach到已经存在的进程进行在线调试------能获取当前栈的所有变量值!

不久前, 我们玩过valgrind定位程序的各类内存问题, 当时非常希望valgrind能对一个已经存在的进程进行attach在线调试, 后来看了valgrind的原理, 发现这样不可行。 只能让valgrind重新拉取新进程进行调试。 在前面的文章中, 也介绍了kill -6和abort函数, 让程序core dump来获取当时栈的值, 其实, 这样似乎没有必要。 ...

2017-03-26 13:21:02 57556 1

转载 互联网创业公司黑话指南 | 嘿嘿嘿……

转载地址:http://www.yixieshi.com/74619.html   整理了一下互联网创业公司常用的黑话,供大家参考。  那个,我很严肃的,不许笑。  1. 老板黑话  你来我办公室一下 = 老子又想到了绝妙的idea  得专注用户体验 = 界面画的好看点  产品气质不

2017-03-25 18:55:47 8215

原创 又踩了权限之坑------模块扩容引起的

大家对linux权限应该不陌生, 比如可执行文件权限, 读取文件自身的权限。 总之, 在linux中, 权限无处不在。 而且会经常踩坑。        不久前, 有个模块扩容, 原来的4台机器被扩容到8台。 同时, 过了几天, 发现某运营数据下降。 运营数据波动的查询, 通常是很蛋疼的, 想了很长时间, 也没有想到哪里出问题了。        某次, 我体验业务发现, 该有的tip

2017-03-25 16:26:06 7136 1

原创 用abort函数主动让进程abort/coredump, 有什么用处?------曾用此方法解决过一个低概率开机卡死的问题

之前玩过一段时间的嵌入式设备(如下叙述以手机为例)的软件开发, 当时出现了一个低概率问题: 系统开机会低概率卡死在某个模块中。 这个问题必须解决。 如果有问题的手机发布到用于手中, 假设概率万分之一, 那也非常高了, 想想某手机厂商的电池爆炸事件吧, 那是何等的低概率, 但还是发生了。 怎么定位呢? 我之前大致说过, 今天再来看看方法(如下简单示意):

2017-03-25 15:55:09 11971 4

原创 用kill -6 pid 主动杀死进程, 使进程abort/coredump, 有哪些用处?

在实际开发中, 要灵活处理各种问题, 今天我们来说说kill -6 命令的使用, 它可以让主动让进程abort/coredump, 来看看一个例子:#include #include using namespace std;struct Point{ int x; int y;};int main() { Point po; po.x = 1; po.y = 2

2017-03-25 15:27:04 21939 2

原创 多个问题,多个原因混杂在一起时候, 不可乱对号入座

最近定位一个问题, 实际上是几个问题混杂在一起, 造成的原因也是多样的。 当时, 我看到一个问题现象, 而且也找到了一个bug,  于是, 在同步初步信息的时候, 我就说是这个bug导致了这个现象, 后来发现, 这是扯淡啊。      bug1导致现象1, bug2导致现象2, bug3导致现象3...,  当仅仅看到bug1和现象2时, 怎么就能乱说是现象2是bug1导致的呢?

2017-03-25 13:47:56 7166 1

转载 linux fopen打开大于2G文件出错的解决方法 (踩了一个大坑)

先说点题外话, 最近某模块缩容, 导致单机任务堆积, 超过了2G,  fopen就失败了。 开始怀疑是文件权限问题, 但排查后, 发现不是, 但依然找不到原因, 后来某哥敏锐地发现, 文件的值在2G左右, 于是怀疑这里有问题, 于是上网一查, 果然如此。        我不写了, 直接转载网上文章描述这个问题, 转载地址:        http://blog.163.com/qimo60

2017-03-25 13:01:15 11401

原创 某定时任务系统的方案设计------软件系统设计能力很重要

来看这样一个问题: 某账号系统的账号都在unsigned int内, 也就是0-42亿左右。 在这42亿账号中, 有大约1亿账号是相对非常活跃的用户, 用户和用户之间可以建立好友关系(类似于微信那样的好友关系)。 现在要设计一个定时赠言系统, 比如: 今天是2017年3月25日, 那么用户A可以给他的好友B送定时赠言(精确到未来某天, 不包括今天), 预期未来这天到达。而

2017-03-25 11:42:24 10896 4

原创 与本地程序相关的一个bug------要配合利用date命令观察才好!

某哥让我看看如下代码输出什么结果:#include #include #include using namespace std;int getTime(int& iBegin, int& iEnd, int days){ time_t tNow; time(&tNow); struct tm tmp_time = *(struct tm*)loca

2017-03-25 09:30:48 7346

原创 如何为一段buffer带上一个头?

学过数据结构的朋友们都应该知道, 在链表中有头结点这一说法, 它是不同于第一结点的。 可以这里理解, 头结点是非业务结点, 而其他结点是业务结点。         很多时候, 我们要在一段buffer前套一个头, 这个头中有这个buffer(或者整个带头buffer)的长度信息, 当然也可以带其他信息。 这是很普遍的。 想想我们的网络协议, 不就是层层加头吗? 当然, 你也可以加尾。

2017-03-25 09:09:19 7407

原创 从“-2”告警跟踪到的问题

前段时间, 业务有告警(错误码“-2”), 仔细跟进去, 发现是: 预计在3月15发出的消息, 到了16号才发出去。          有两个怀疑点:          1. 当时保存任务的时候, 保存到了16号的任务系统中;          2. 当时保存任务的时候, 保存到了15号的任务系统中, 到15号码并没有发完, 可能是系统积压等。 (定时的东西, 难免会有这坑那坑的)

2017-03-25 09:04:06 7154 1

原创 定时系统“同时”之坑------理论可行, 实际不一定行; 理论不可行, 换个思路,实际可能会行!

某次, 遇到安全问题, 需要改造技术方案。 两条逻辑捆绑的消息被强行拆开, 由cgi设置一个相同的时间, 两条消息分别带着相同的时间戳进入定时系统。 定时系统在时间戳对应的时间点将两条消息同时转发, 预期同时达到另外一端。          如图:                   然后, 大坑就来了。  定时系统是个比较复杂的系统, 消息m1和m2进到定时系统后, 就像两

2017-03-25 01:35:52 7329 1

原创 又一个乱码问题------ gbk和utf8

晚上用工具发包, 无意发现了一个乱码问题, 大吃一惊, 以为外网有问题。 但这么长时间了, 怎么没有反馈呢? 难道是我下午做的改动影响到了外网? 总之, 不放心, 那就搞个究竟吧。           和某哥一起查了下, 终于查出来呢。 某哥说我查问题的思路有点乱, 反思一下, 确实有点。           不可乱, 要清晰。           最终发现是, 发包工具的转换问题,

2017-03-24 23:56:33 7186 1

原创 用killall命令可能会酿成事故哦!

最近, 用/usr/local/php/bin/php执行了某php文件10次, 开启了10个进程, 准确杀掉, 于是想用killall /usr/local/php/bin/php, 被某哥提醒, 会误杀/usr/local/php/bin/php卡其的其他进程, 想想也是。         怎么办, 用ps, grep, xargs, awk, kill搞起吧。

2017-03-24 23:42:13 8107 1

原创 被调错误聚集在单个IP上, 可能是主调的问题哦!

在工作中, 如果遇到被调聚集的问题, 一般直接找负责被调模块的同学帮查看和处理。 但最近, 我却懵逼了。        被调负载均衡地提供着服务, 假设有3台机器。 某天, 被调出故障后, 立即剔除其中的某台机器, 剩下2台。 如果主调利用了负载均衡策略获取被调ip, 那自然是没有问题的, 主调自动改为对被调的2台机器发包.        但是, 某次, 主调却非常意外地没有用负载均衡获取

2017-03-24 23:37:37 7131

原创 string的erase方法, 第一次见, 没什么好说的

#include <iostream>#include <string>using namespace std;int main(){ string s = "abcdefg"; s.erase(2, 1); cout << s << endl; // "abdefg" return 0;}

2017-03-24 23:22:59 7247 2

原创 解决100个进程莫名其妙逐渐挂掉的问题

上周天遇到这样一个问题: 开启某操作后, 开启了100个进程, 几分钟内, 这些进程逐渐全部挂掉了。 当时无法用root身份登录机器, 无法看到内核log信息。 蛋疼了一整天,  但这个问题几乎必须要在24:00前解决, 几乎是必须。 白天的思路是, 肯定要100个进程才能快速做完啊。 而且之前在别的机器上, 也玩过200个进程同时跑的事。         找了好久, 都没有找到原因,

2017-03-24 00:04:21 9095 1

原创 一个oom(out of memory)问题的定位和“”解决“”

先说下背景: 主调模块有n台机器, 被调模块有6台机器(均衡地提供服务), 他们之间是网络调用。 而且, 被调模块在收到主调模块的网络包后, 先立即回一个响应给主调模块, 然后做自己的事情。 从去年到今年, 一直有个告警, 差不多每两个星期会遇到一次, 主调的log显示, 调用被调机器时超时, 而且每次根据log分析, 都是集中在某一台被...

2017-03-23 23:43:07 10446 4

原创 再再再说编译时遇到的cannot find -ltest错误

之前已经说过多次cannot find -ltest问题, 最近准备发版本, 在公共的编译机上, 遇到了类似cannot find -ltest, 这个我们已经很熟悉了, 立即在编译界面上搜索ltest呗, 然后找到对应的目录, 编译出libtest.a库即可。 但是, 在编译信息中, 没有搜到。 奇怪啊!          反正是缺libtest.a库, 我就去自己的开发机的编译目录下找了l

2017-03-23 22:49:48 8313 1

原创 谨慎使用map的下表操作

我们都知道, 当map不存在某key时, 如果用下标操作, 便会产生新key。 因此, 要特别注意, 最近一个同事中招了, 如下:#include #include #include using namespace std;int main(){ map m; m["k1"] = "good"; // 同事A if(m["k2"] == "") { cout <<

2017-03-23 22:41:30 7532 1

原创 按大小统计目录、文件大小的命令:du -a --max-depth=1 | sort -rn | awk '{print $2}' | xargs du -sh

你肯定会遇到这样的时候, linux机器上的磁盘太满了, 想删除一些没用的。 好, 那先用df -h命令查下磁盘情况。 问题是, 怎么知道哪些目录占据了较大的空间呢? 直接用       du -a --max-depth=1 | sort -rn | awk '{print $2}' | xargs du -sh       搞起吧!       解释下:      du

2017-03-21 22:47:41 13078 2

原创 说说kill和kill -9

kill是linux中被误解很深的一个命令, 很多人以为它是杀死一个进程, 其实不然。 关于这一点, 我在之前的博文中已经提到过了。 kill的真实含义是, 向进程发送信息。       kill  1234  是向进程1234发送一个SIGTERM信号。 最近, 我在用valgrind调试程序时, 发现kill无法终止进程, 于是用kill -9 1234试了一下, 果然就真kill了, k

2017-03-13 23:59:17 13314 2

转载 valgrind---memcheck工具命令选项

转载地址:http://blog.csdn.net/strategycn/article/details/7865525--leak-check=:如果设为yes或full,在被调程序结束后,valgrind会详细叙述每一个内存泄露情况,默认是summary,只报道发生了几次内存泄露。--show-possibly-lost=:默认是yes。若设为no,则内存泄露检查将

2017-03-12 20:25:38 7448 1

原创 实例介绍利用valgrind定位变量未初始化的问题

继续介绍valgrind的用途, 看程序:#include #include int main(){ int i; if(i == 0) { printf("[%d]\n", i); } return 0;}      一眼就能看出程序的问题, valgrind分析如下:[root@xxx ~/valgrind-3.8.1/bin]# g++ -g test.cp

2017-03-12 20:07:35 8272 4

原创 实例介绍利用valgrind定位strcpy/strncpy/strcat/strncat内存重叠问题

和前面的memcpy类似, strcpy/strncpy/strcat/strncat都存在内存重叠问题,  为了简便示意起见, 我用strcpy做例子来说明。 值得注意, 有时候, 在你的环境下, strcpy没有出现如下的问题, 不表明他真的没有问题。 看程序:#include #include int main(){ char str[100] = "abcdefghijklmn"

2017-03-12 19:55:39 7677 3

原创 实例介绍利用valgrind定位memcpy内存重叠问题------顺便再次说说memcpy和memmove的区别

继续介绍valgrind的使用, 看程序:#include #include #include int main(){ char a[] = "abcdefghijk"; memcpy(a + 1, a, 5); printf("%s\n", a); return 0;}     先看看结果:[root@xxx ~/valgrind-3.8.1/bin]

2017-03-12 19:25:40 8694 1

原创 实例介绍利用valgrind定位内存非法访问问题

本文继续介绍 valgind的使用, 看程序:#include int main(){ int a[100]; a[10000] = 0; return 0;} 用valgrind分析:[root@xxx ~/valgrind-3.8.1/bin]# ./valgrind --tool=memcheck --leak-check=yes --s

2017-03-12 19:07:54 10704 1

原创 实例介绍利用valgrind定位内存异常释放问题(double free 和wrong free)

之前介绍过利用valgrind来定位内存泄漏(慢性病, 会导致程序在某个不确定的时刻异常), 本文我们来简要介绍利用valgrind来定位内存的重复释放(急性病, 会报纸程序崩溃)。 看程序:#include #include #include int main(){ char *p = (char *)malloc(30); free(p); free(p); re

2017-03-12 18:48:53 12532 2

原创 实例介绍利用valgrind定位内存泄漏问题

在前面的文章中, 我们简单了解了valgrind工具的用途以及安装, 以便大家能进行实际操作。 在本文中, 我们通过实例来看看如何利用valgrind来定位内存泄漏问题。 先看程序:#include <stdio.h>#include <stdlib.h>char* getMemory(){ char *p = (char *)malloc(30); return p;}int main(){ char *p = getMemory(); p = NULL; return 0

2017-03-12 17:36:56 22939 7

原创 强大的linux tool------valgrind的简介以及安装

valgrind是linux下的一个强大工具, 其子工具(通过toolname参数来控制)主要有: 1、memcheck:检查众多内存问题,如泄漏、越界、非法指针, 我们将一一介绍。 (如果省略toolname, 则默认是memcheck, 比如执行: ./valgrind ./a.out) 2、callgrind: 分析程序性能。 3、cachegrind:分析cache. 4、helgrind: 分析多线程竞争。

2017-03-12 17:05:56 22868 4

原创 oom和oom-killer实例简介(内存用完和进程杀死)------顺便说说linux下的两个重要目录:/proc/kmsg和/var/log/messages

oom就是out of memory, 意思就是内存用完了(内存泄漏可能导致这种现象)。 在linux中, 如果linux机器的内存用完了, 会怎样呢? 很显然, 系统肯定无法正常工作。 linux当然要考虑这种问题, linux会杀死占用内存很大的进程(这些进程后续可能被重新拉取), 从而释放出一些内存, 来保证整个系统的的正常运行, 这就是linux oom-killer的机制。 在oom期间, 系统经常会遇到一些莫名其妙的异常, 这是能理解的, 因为内存吃紧啊。 过一会儿, 经历o

2017-03-11 21:29:54 18219 5

原创 linux的pidof命令

第一次看到linux下的pidof命令, 很简单, 就是找出进程名对应的进程号, 试了一下pidof xxx, 靠谱。 如果开启了多个进程, 则返回的是多个进程的进程号。       不过, 又感觉这个命令没有什么卵用, 直接ps -aux | grep xxx 就可以搞定啊!

2017-03-11 20:08:12 17638 4

原创 又是管理端入口引入的错误------类似事情过去发生, 现在发生, 未来还会发生!

程序员都知道, 要用宏定义代替魔鬼数字, 可是, 现在的产品、运营经理们也变的刁了, 他们经常说: 这个值不要写死, 做成可配的! 呵呵!        在这种情况下, 一般要为产品、运营同学做一个管理端, 让他们可以配置对应的数据, 然后程序去读取这个数据, 实现数据的可配置化。 这样就实现了开发同学和产品、运营同学职责的分离, 易于变动, 比较灵活。        但这种方式也非常容易

2017-03-11 13:30:19 6993 2

原创 两例本地rsp结构体错误的定位------思路!

req = request rsp = response 最近遇到这样一个问题: 客户端请求服务端, 正常地触发了服务端的功能。 但客户端在接受到服务端的回包后, 本地log显示结构体rsp不完整。 定位思路: 先看有没有收到回包, 回包是否正确(可以用工具检验), 然后看看为什么正确的回包没有被自己的程序正确解析。 后来发现, 是协议扩充时候, 本地rsp结构体没有对应扩充, 导致只解析了回包的部分数据。

2017-03-11 12:48:36 7410

原创 利用随机数来加快代码调试速度

有的时候, 我们需要知道系统或者代码在不同输入值情况下的结果,  当我们设置一个值后, 编译数分钟, 然后放在系统中跑起来, 看到一种结果。 然后改变一下这个值, 编译数分钟, 然后放在系统中跑起来, 看到另外一种结果。 这是非常浪费时间的。        有的朋友可能要说, 搞个循环啊, 把可能的输入值循环一遍不就行了? 但是, 有的时候, 不太方便执行这种循环操作, 那怎么搞呢? 我一般用

2017-03-06 01:13:19 7171

原创 需要引起重视的gbk<--->utf8

最近开发并自测一个新功能, 我对其中一处的显示不太放心, 但感觉有80%的把握。 不管怎么样, 心里始终不踏实, 那就实际验证一把吧。       验证英语和数字显示的时候, 是OK的, 但是中文显示的时候, 出了问题, 我晕, 果然有bug.  一看就知道, 这是典型的gbk问题。 转换之后, 搞定! 避免了被投诉的风险。       说两句:       1. 作为程序员,

2017-03-06 00:49:40 7284 1

ipscanner.rar

获取网络的ip, host name和mac地址。我想免费让大家下载, 但csdn规定了必须设置积分, 没办法。

2017-12-01

linux protobuf安装文件

linux, google protobuf, 安装文件。 使用方法:http://blog.csdn.net/stpeace/article/details/53029812

2016-11-04

linux tree命令的源码

很多linux上没有tree命令, 该资源提供了tree命令的源码, 大家可以下载, 编译并安装, 具体请参考:http://blog.csdn.net/stpeace/article/details/49524273

2015-11-01

编译好的openssl库和头文件

编译好的openssl库, 欢迎使用, 具体使用方法, 请见http://blog.csdn.net/stpeace/article/details/41921287

2014-12-14

入门数据库sqlite3的最佳实践资料

入门数据库sqlite3的最佳实践资料, 里面是我打包好的程序, 附加一些数据库工具, 非常可以。 当然你也可以参考我的博文http://blog.csdn.net/stpeace/article/details/38503843

2014-08-12

Wireshark抓包工具

Wireshark抓包分析工具, 非常好用, 非常实用。

2014-06-08

优秀的截图软件

截图软件fast stone. 解压即可使用。 解压后, 可能会产生一些依赖性文件, 请不要轻易删除。

2014-05-25

获取网卡信息所需的头文件和库

获取网卡信息所需的头文件和库:IPEXPORT.H Iphlpapi.h IPHLPAPI.LIB IPRTRMIB.H IPTYPES.H

2013-10-19

哈希值计算软件

可以计算md5, sha1, sha256等哈希值的工具软件,我无法形容它的优秀。

2013-10-18

在Windows下学习Linux命令

在Windows下想学linux命令的同志,你终于找到了该资料。用法:解压,然后双击其中的cmd.exe, 然后就可以输入linux命令了,比如ls等(千万要注意,不要进行路径切换,否则linux命令就执行不了,总之,要确保相应文件在当前目录下)。

2013-08-08

计算机网络第5版谢希仁编配套光盘资料

计算机网络第5版谢希仁编配套光盘资料,这是计算机考研的指定教材对应的资料,你应该拥有它。

2013-07-19

OllyDBG反汇编工具

OllyDBG反汇编工具,非常强大。深化功底,需此工具。

2013-07-19

masm汇编器

微软的汇编器,其中有关键的masm.exe和link.exe,我试过,发现可用。

2013-07-19

word转pdf的插件

word转pdf的插件,直接安装即可,安装完后,“另存”word文档的时候,可以选择pdf(我用的word版本为2007)。

2013-07-18

音频处理软件Gold Wave

一款强大的音频处理软件,可以对音频进行各种处理。例如:如果你在准备某考试,需要听音频资料,但是,你嫌音频太慢,而且你的MP3播放器无法加速,那么你可以用该软件对音频本身进行加速,即改变音频本身,使之变快。另外,在处理的时候,可以实现批处理(我亲自实践过,发现可行)。

2013-07-17

H.264visa软件

一款非常强大的H.264视频码流的解析软件,可以看到解码后视频的像素值,运动矢量,宏块等非常多的信息(也可以打开原始的YUV视频,并看到像素值,但必须先用该软件打开某一H.264视频码流),比Elecard StreamEye软件(有bug)更为强大,我一直用H.264visa,目前没有发现有什么bug. 另外,该软件安装后1个月就会过期,没有关系,1个月后,你重新安装一次即可。

2013-07-13

Elecard StreamEye

Elecard StreamEye,一款分析H.264视频码流的工具,如果你在学习H.264,那么,你应该拥有它。

2013-07-13

YUVviewer :原始的YUV视频的播放器

原始的YUV视频的播放器(软件不是我写的),如果你做视频处理、视频压缩编码、视频通信、视频检索、视频取证,那么你很可能需要它。该软件的缺点是:你无法看到YUV视频的像素值。

2013-06-24

经典的C语言编译器:TC2.0

一款经典的C语言编译器:Borland Turbo C 2.0. 怀念Borland产品的人可以用一下,体验一下DOS下的编程。如果是C语言初学者,建议用MS的VC++6.0. 我试过,该TC2.0可以正常使用。

2013-06-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除