自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

太阳落雨

擅长Windows开发调试,后端服务的研发

原创 Windbg调试----多线程控制调试

在调试程序的时候,可能经常会有这样的需求,让一个线程在特定的时候才让其开始执行或者暂停执行。比如复杂的多线程导致死锁的问题,又或者多线程中的Race Condition 导致程序执行异常等。很多时候,我们可以借助编写调试代码来达到多线程的调试,可是有些情况下调试的执行粒度是指令级别的,那么这个时候我们得借助调试利器Windbg了。本文我们将以《C/C++编程教训—-函数内静态类对象初始化非线程安全(

2017-09-03 18:29:36 2143

原创 C/C++编程教训----函数内静态类对象初始化非线程安全(C++11之前)

不少程序员在编写程序的时候,会使用函数内静态(static)变量,既能满足函数内这个变量可以持久的记录某些信息,又使其访问范围的控制局限于函数内。但函数内静态类对象初始化是非线程安全的。问题背景在我们产品中对log4cxx做了一些简单的封装 (采用VS2005编译),其中会调用到getWarn这个接口。由于这个函数存在非线程安全的问题,导致程序Crash。为了更好的描述问题,博主后面采用一个简单的例

2017-09-03 16:57:59 2049 1

原创 CPU百分百问题的研究

在对代码进行测试的时候,发现进程占用了100%的单核CPU资源。并且发现在另一个环境,这个进程占用了50%的CPU资源,因为在这个环境中是2核的CPU。而此时这个进程还并没有处理任何的数据,也就是说会有一个线程一个只占用一个CPU核的资源。对于这个问题研究的方法主要用到了两个工具:Process Explorer和Windbg。使用Process Exporer查找占用CPU资源的线程博主采用了一个

2017-05-28 09:54:58 1019

原创 C/C++编程教训----数据结构的类型别名和memset

问题描述学习微软,我们经常会这样定义数据结构, 并且定义了数据结构别名StructTest,和数据结构指针别名LPStructTest, 这样定义也许让程序的类型更加简洁。typedef _StructTest{ int iVal; char csStr[100];}StructTest, *LPStructTest;数据结构变量定义一般使用StructTest sTest这种形

2017-05-14 16:52:55 692

原创 Windows中实现不依赖账户登录的开机启动程序

在Windows中很多的任务,我们希望能够在Windows 启动之后自动运行。举个例子,公司有个订饭系统,基本每天都需要登录去订饭,于是写一个脚本实现自动订饭。可是你的电脑每天要关机,当然不希望开机后还需要手动运行这个订饭脚本了。于是此时我们要将其这种脚本实现为开机自动启动脚本。 但要注意本文要讲的开机启动的程序,是在用户还没有登录的情况下实现启动的。换句话说,本文描述的开机启动的程序运行在Ses

2017-05-12 14:23:00 15107

原创 C/C++编程教训----'=='判断条件

程序质量保证个人谈一谈项目代码质量保证主要来源于以下几个方面:程序员的经验,防御性的避免一些错误/坑。单元测试: 单元测试应该是测试中最细粒度的测试,这个测试一般来说贯穿了整个开发以及后期维护;它能够保证到每一个函数/功能的健壮性,从而提高代码的整体质量。测试自动化: 测试自动化,应该来说至少应该包括了单元测试和功能测试自动化。 在开发或者维护过程中,在修改代码后,能够迅速的使用自动化测试进行

2017-04-22 16:47:32 895

原创 Windbg无法捕获strcpy_s crash时的函数调用栈的研究

问题描述在一年前,发现产品的windows service总是崩溃,但每次用windbg attach或者adplus产生dump,总是不能捕获到程序出错时候的栈,而且crash的时候只能看到少数甚至只剩一个线程。后来用windbg单步调试终于找到的罪魁祸首,原来是出错在strcpy_s这个函数。但是为什么直接用windbg attach或者adplus没法获取第一现场呢?当程序比较简单的时候

2017-01-22 09:46:31 1094

原创 用户模式程序Dump收集

发布给客户的程序,出现问题后,通过Debug Log经常很难分析出原因。比如说程序崩溃,程序死锁,内存泄漏等,这个时候从客户那里收集程序Dump,本文主要描述了几种收集dump的工具。adplus收集Dumpadplus是windows 调试工具集中的一个工具,安装了WDK或者Windbg后在安装目录都有。现在很多的OS 都是64位了,但有时候Crash的程序是32位,有时候Crash的程序是64位

2017-01-12 15:14:10 720

原创 Windbg局部变量显示不正确

Windbg中局部变量显示不正确

2016-08-17 13:25:53 1706

原创 存储型跨站脚本攻击

XSS跨站脚本攻击(Cross Site Script, XSS),是最常见的Web应用应用程序安全漏洞之一,也是OWASP 2013 Top 10之一。 XSS通常来说就是在网页中嵌入恶意代码, 通常来说是Javascript,当用户访问网页的时候,恶意脚本在浏览器上执行。存储型XSSXSS主要分为三种类型: 反射型XSS,存储型XSS和DOM型XSS。本文主要阐述的是存储型XSS,简单来说明一下

2016-08-10 22:06:18 12559 2

原创 OWASP Mutillidae的安装

OWASP Mutillidae介绍OWASP(Open Web Application Security Project)是一个开源的、非盈利性的全球性安全组织。由全球的会员共同推动安全标准、安全测试工具、安全指导手册等应用安全技术的发展。OWASP也有中国的官方网站, 在这里你也可以关注到OWASP在中国的培训与活动等相关信息。 OWASP Mutillidae 是一个开源的、免费的漏洞演习系

2016-08-08 13:51:30 6300

原创 Windbg调试----Windbg入门

Windbg简单来说就是一个Windows下对用户态/内核态的程序进行调试,以及对Core Dump文件的分析。对于Crash,资源泄露,死锁等问题的分析,Windbg是一个强有力的利器。相关资料本人也是在维护和开发产品的过程中使用过Windbg,但并未对Windbg进行过系统和深入的学习,也通过这一系列的博客来完善自己对Windbg以及周边知识的理解与使用。我也列出自己正在或者即将阅读的书/资料与

2016-08-05 13:26:41 47788 2

原创 Visual Studio的工程依赖

今天在查看Visual Studio中A工程的时候,发现在VS链接页面的Command链接了B.lib静态库,可是我找遍了配置选项,也没找到配置的地方啊!!!经过探索发现,原来是工程依赖隐含了这个条件。 也就是说工程依赖至少实现了一下两个功能:      (1) 定义了工程编译的顺序,比如A工程依赖B工程,则编译A工程的时候回去先编译B工程      (2) 隐含了静态链接Lib文件,比如

2015-10-09 16:23:11 2297

原创 从图看Linux问题分析的工具

Brendan是Joyent的首席性能分析工程师,在2013年初发了一个关于Linux性能分析和工具详解的书,或者称其为文档吧。无论在性能分析,还是在Linux中其他问题分析,也许都会用到下图所标识的工具。 比如网络分析时会用到tcpdump, traceroute, netstat等工具;I/O分析的时候会用到iostat,iotop等工具;内存分析的时候会用到free,vmstat等工具;进程

2015-09-14 14:35:33 609

原创 GDB读取动态库中定义的全局变量错误

最近看了一篇getopt使用的文章,为了追踪其执行的逻辑,于是采用GDB挂载调试的方式进行查看。但却出现了GDB打印全局变量optind的时候出现错误。问题发现和描述      首先optind是使用getopt时候的全局变量,表示使用getopt时候的下一个argv的指针索引。在应用程序调试的时候设置了多个参数,但是随着多次调用getopt,全局变量optind通过gdb打印出来的值却总

2015-09-04 13:23:03 1903

原创 Windows文件换行符转Linux换行符

前段时间,有个朋友碰到由于Windows的换行符和Linux换行符不一样,导致程序编译不通过。这个问题之前自己也碰到过,网上资料也蛮多,不过还是借此总结总结,因为发现总结+实践的方式能够让自己更好的提升。操作系统文件换行符      首先介绍下,在ASCII中存在这样两个字符CR(编码为13)和 LF(编码为10),在编程中我们一般称其分别为'\r'和'\n'。他们被用来作为换行标

2015-08-21 18:06:16 19568 1

原创 程序RPC 1726错误问题的追踪

最近在客户环境中碰到了一个头疼的问题,一个节点通过RPC连接到另一个节点成功,但是在发送RPC报文的时候,却返回了1726错误。错误信息      先来看看MSDN的解释,"这个远程调用失败了",这句话信息含量真是太少了啊,出现错误我肯定知道是远程调用失败了啊。RPC_S_CALL_FAILED1726 (0x6BE)The remote procedure call failed

2015-08-21 11:08:19 1639

原创 <<程序员的自我修养>>第二章读书读书笔记----静态链接

最近搞了一个Linux爱好者的微信订阅号,以Linux平台为主,定期也会分享一些网友的博文,和技术经验。因为网络文章,不和博主沟通,没法随意转发分享,如果您方便让您的经验一起分享,请您留下博客地址~~~以下是微信的订阅号,欢迎关注和讨论:         对一个不善写作的人来说,写一篇博客着实痛苦,但还是逼着自己去写,让所学的东西加深。本篇博客将对第二章内容进行回顾,理解,当然还要加上

2015-08-03 13:20:33 926

原创 <<程序员的自我修养>>第一章读书读书笔记----从hello world说起

在读《程序员自我修养》这本书之前,是准备写读书笔记的,一来加深自己对本书的理解,而来可以和看到笔记的网友们互相讨论。当读到第三章的时候,心理暗暗偷懒,不想写博客了,要将自己的所读所理解的整理为一篇文章,确实会花费不少时间和精力,可又想了想了当初的目标和想法,还是决定写下去。 C语言Hello World程序你了解多少?第一章作者就抛出了一个问题,从一个简单的C程序的HelloWorld

2015-07-10 15:36:10 1521

原创 Loader Lock引起的一个Bug

在Windows中,让程序模块化实现的一种方式,就是让其实现为动态链接库。然后在主程序启动的时候隐式或者显示的去加载动态链接库。但是如果不恰当的编写动态链接库的DllMain函数,将会引起意想不到的Bug哦,比如典型的Loader Lock死锁问题。这不,我们产品中就碰到了一个由于Loader Lock而引起的Bug....1. 背景介绍      当主程序在启动的时候,隐式或者显

2014-10-13 15:29:34 4097 1

原创 strace命令不可信任的一种情况

在Linux中在客户环境中诊断问题的一个非常有用的命令就是strace,可以利用其查看程序执行过程中的系统调用,调用库,每一个系统调用的时间,以及接收到的信号等等,在这里就不详细阐述strace的功能了。     最近刚好遇到一个棘手的问题,在一个客户的环境中,应用程序调用系统调用ioctl与产品的内核模块交互总是失败。然后通过strace查看进程的执行过程中的ioctl系统调用是否有异常。查

2014-09-03 19:42:14 1469

原创 Redhat 6.3中syslog信息丢失

我们采用Linux的syslog来记录产品的debug log。调用其中的一个可执行文件,执行完命令之后,查看debug log的信息,居然从某一条log之后的log都丢失了。多次尝试后,发现每次都在某条固定的log之后的所有log都丢失了。这篇博文就让我们一起来探个究竟。一. 问题发现    在发现真正问题之前我做了以下尝试:    (1) 进程是否在固定log之后某种逻辑退出?或者

2014-07-10 17:19:28 8977

原创 Linux中删除文件,磁盘空间未释放问题追踪

在客户使用我们产品后,发现一个问题:在删除了文件后,磁盘空间却没有释放。是有进程在打开这个文件,还是其他情况?我们一起来看看一下两个场景一. 场景一:进程打开此文件    当一个文件正在被一个进程使用时,用户删除此文件,文件只会从目录结构中删除,但并没有从磁盘删除。当使用这个文件的进程结束后,文件才会真正的从磁盘删除,释放占有的空间。    我们发现剩余磁盘空间比较少时,回去删

2014-07-09 14:09:33 23332 3

原创 Linux Kernel 模块内存泄露查找 (2)

在之前的一篇博文<<Linux Kernel模块内存泄露的一种查找思路>>中,我介绍了一种查找内核内存泄露的一种方法。这不才几个月,又有客户埋怨:使用了产品5天左右后,Suse服务器由于内存耗尽而Crash。O My God,不会吧,在我机器上跑的好好的哇(程序员常用名言 嘿嘿)。 那么就让我们一起来看看,苦逼的博主是如何确定问题并且找到问题的....

2014-06-19 10:42:53 8607 1

原创 创建动态库时,建议使用的链接选项Bsymbolic

题外话:最近了解了一种轻量级标记语言,叫做Markdown.可以使用Markdown易读的文本格式,然后将其转换为HTML格式。虽然才知道,发现这个语法已经在无处不在了,著名的stack overflow发帖,以及一些wiki,或者一些博客都支持这种语法编辑了。OK,那么博主,这次也尝试下,本次博客采用的是MarkDownPad编辑器编写。问题描述回归正题,前段时间项目开发中,实现

2014-05-14 19:08:22 10873

原创 链接选项rpath,容易被忽略的一个功能

问题来源最近在做一个项目的客户端的SDK,实现为一个动态链接库,其依赖于其他的若干个动态库文件。那么在利用SDK开发应用程序的时候,编译的时候除了链接SDK库本身,还得链接SDK库所依赖的库,这样编译命令里面得一一的添加这些库。比如,SDK库的名称为liba.so, 其依赖于libb.so和libc.so,那么在编译应用程序的时候使用以下命令:+++++++++++++++++++++

2014-05-07 18:28:19 15931 1

原创 Linux Kernel模块内存泄露的一种查找思路

一.问题描述    最近有个客户报了一个问题:如果运行我们的产品,则每天将会增长大概30M的内存,大概4个多月内存就会耗尽。和大多数程序员的反应一样,“不会吧,在其他客户机器上都跑的好好的啊,从来都没有遇到过这样的问题”。最后的结果,也往往告诉程序员一个铁的事实:你的程序确实出问题了!    如果你某天发现通过“Free”查看内存几乎耗尽,但通过top/ps命令却看不出来用户态应用程序占用

2014-02-14 14:12:11 14680 1

原创 Windows命令行无法删除文件

最近负责我们团队的自动化测试工作,在一个测试用例中,需要将一个病毒拷贝到测试机上,扫描过后,清理现场,通过命令行命令删除病毒。命令执行和命令结果如下:C:\test\virus>del virus.iniC:\test\virus\virus.iniAccess is denied.居然出现了Access Denied,分析步骤如下(自己真是傻傻分不清楚啊):(1) 手动从Wind

2013-12-30 16:05:56 1552

原创 Robot Framework中Python加载相对路径DLL

在前一篇博文>中,提到如何使用Python使用C/C++编译成的DLL,从而让自动化测试中调用过程更加灵活。在Robot Framework,使用Python编写函数对A.DLL进行加载,A.DLL又依赖于B.DLL,于是将A.DLL和B.DLL放到Robot Framework工程目录下,即工程执行case时的工作目录。OK,这样没有任何问题,可是你能够忍受就将这些DLL毫无规矩的放在这个地

2013-12-12 21:13:48 7585

原创 Python调用C/C++动态链接库

吐槽(可略过):不知不觉,4月份毕业,5月份进入团队,已有7个月。大的方面经历着测试、解决客户问题/bug、出一个产品Patch,小的技术方面经历着C++,Shell,python,linux Kernel以及自动化测试框架,看起来经历都很丰富,但何尝不处于一种浅尝辄止的状态?!似乎就像学生时代,寂寞了,就找点不会的技术学学,然而都钻的不够深入。也许现在的境遇,和自己本身的职位也有所关系,不像De

2013-12-04 16:39:49 33094 3

原创 Redhat6中获取LANG值为空

问题描述首先来描述一下我遇到的问题:如下图所示在我们产品中,服务脚本splx放置在目录/etc/init.d中,在用命令 "service splx start" 后,脚本中启动应用程序entity,entity进程中使用命令 "locale" 来获取当前所使用的语言。但是获取的LANG的值为空......问题追踪首先,在安装了产品的Redhat5上查看是否存在同样的问题(检查

2013-11-25 21:27:42 2147

原创 Robot FrameWork安装以及一个Demo

Robot FrameWork是一个自动测试框架,可到官网查看详细介绍。安装 Robot Framework本文中的Robot framework安装在Win7 (32 bit) 平台上. 接下来按顺序安装以下的软件/包。SoftwareVersionPost-stepsNotePython

2013-11-21 19:31:35 20163 1

原创 whereis+whatis+man

使用Linux过程中无论是使用shell命令、程序开发或者用户文档都需要使用到强大的男人man命令。使用方法也十分简单,以查看ls命令的使用方法为例:man lsman的搜索路径通常包括以下两个路径:/usr/local/man//usr/share/man/你可以通过whereis 命令来获取命令或者文档的位置,以搜索ls命令为例:[root@Cent

2013-11-14 19:04:18 1588 3

原创 Red Hat 5 USB安装和配置

开场闲话,可略过。在本科的时候,接触了Ubuntu Linux,觉得这种非桌面主流产品的操作系统只有Geek才会去碰他,直到现在还对使用Linux并且在Linux下工作的同行保持高度仰慕。当时感觉在Linux下安装软件问题多多,GNome桌面没那么上手,甚至也没法顺畅的晚上喜爱的Warcraft,于是也逐步的对Linux丧失了热情,决心好好的钻研Windows。三分钟热度永远成不了大神,被Wind

2013-10-17 19:52:18 3884

原创 文件atime未变问题的研究

在Linux上运行的,很少的应用程序需要获取精确的atime时间,并且Linux核心开发人员从Ext3/Ext4文件系统的性能角度出发,决定在2.6.30版本的内核中修改atime的更新方式,只有在以下三种情况之一才会更新atime:(1) 如果将分区mount的挂载的时候指定采用非relatime方式(默认采用relatime方式),如strictatime.补充:在OS启动的时候,将各个分区挂载到不同的目录,在挂载(mount)的参数中采用strictatime,表明及时更新atime。在2.

2013-09-24 20:42:55 3056 2

原创 SSH应用

SSH(Secure Shell)可以通过RSA公钥加密算法,进行安全的远程登陆和远程操作。使用SSH,登陆的账号/密码以及命令都是经过加密的传输的,从而保证在传输过程中不会被hacker或者eavesdropper窃取信息。1. SSH 登陆原理理解SSH的加密原理要对公钥和私钥有一定的了解,在SSH信息传递过程中公钥为加密秘钥,私钥为解密秘钥。例子:Client用SSH登陆

2013-06-10 12:45:21 2363

原创 九种常用排序的性能分析总结

间间断断的将9种排序实现,并且将其以博客笔记的形式记录下来;现在就该来综合的分析这九种排序,让我们先来看看其算法复杂度和稳定性的分析结果:算法复杂度以及稳定性分析算法名称平均时间辅助空间稳定性冒泡排序O(n2)O(1)是选择排序O(n2)O(1)否插入排序O(n2)O(1)是自底

2012-09-07 12:55:14 14057 20

原创 希尔排序

插入排序的算法复杂度为O(n2),但如果序列为正序可提高到O(n),而且直接插入排序算法比较简单,希尔排序利用这两点得到了一种改进后的插入排序。一. 算法描述希尔排序:将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序......最后选择增量为1,即使用直接插入排序,使最终

2012-09-06 19:40:14 56488 13

原创 基数排序

前两天去女子监狱某部门维护了下导师10年前的一个程序,发现偌大的一个系统,真正常用的1/10感觉都不到;其实就像我们所学一样,像容器一样装在自己的脑海中,工作中用到的知识确实极少的;知识的深入带来的必然是广度发展,万事万物皆有联系,而且厚积才能薄发。    排序算法写了n种,可不像孔乙己一样考验"茴香豆"的"茴"字有几种写法,而是思维的一种拓展,等到使用的时候根据特定的场景变能灵活的选取更加合

2012-09-04 21:23:47 29811 13

原创 SQL Server 2000安装程序配置服务器失败

因为在Windows Server2003上进行反复的重启安装进行尝试,花费了太多时间,所以记录下来帮助别人,同时也为自己保留一份记录。错误信息在安装SQL Server 2000过程中,出现错误提示:"SQL Server 2000 安装程序配置服务器失败,参考服务器错误日志和C:\Windows\sqlstp.log了解更多信息。"解决方法安装失败首先想

2012-09-01 20:09:13 20145

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