windbg高级条件断点初探

谷歌浏览器崩溃排查:闪退、卡死、网页打不开的修复指南 浏览器多进程架构通过进程隔离、GPU加速和扩展沙箱提升网页渲染效率,但配置损坏、扩展冲突、显卡驱动异常或系统资源不足时,常会以闪退、卡死、白屏、内存占用飙升和能上微信却打不开网页等形式暴露。排查价值在于先分层定位系统、进程、配置扩展与网页内容,再用无痕模式、chrome://crashes、chrome://gpu和浏览器任务管理器收集证据,避免盲目重装。对办公、开发运维和日常维护场景,禁用扩展、关闭硬件加速、刷新DNS缓存、重置配置文件乃至干净重装,都是可复用的工程化处置手段。围绕谷歌浏览器崩溃的典型症状 阅读详情

背景介绍:

我对windbg高级条件断点的探究起源于最近遇到一个问题:一个很久没有修改过的模块(rtutils.dll)在用户机器上出现了崩溃,由于模块太旧,且维护人员已经离职,无从知晓到该模块是何时,由谁加载的。为了弄清楚这个问题,于是想到用windbg的条件断点应该能定位问题,并进行了一番初步探究。

分析:

如何才能够定位到是谁加载的rtutils.dll呢?我首先想到的是系统API里的LoadLibrary,毕竟dll加载都得使用这个API,而且LoadLibrary有一个参数,表示要加载的文件路径。接下来要解决的就是如何对LoadLibrary下断点了,由于工程很庞大,加载dll有上百个,如果每个LoadLibrary都断下来,然后通过看参数内容是不是rtutils.dll来定位,那估计眼睛都会看瞎的。怎么办?这时强大的windbg条件断点语句就该出场了,让他帮我完成一个当LoadLibrary的参数中包含“rtutils.dll”字符串时就break的断点,然后就能用kb看堆栈,就能找到加载dll的源头了。


编写条件断点语句:

这里将要用到windbg脚本的相关语法,这里只对用到的语法和命令作简单解释,有兴趣的可以参考入门教程:windbg 脚本简单入门,如果想获取更加详尽的语法知识,可以查看windbg的帮助文档。

为了能让复杂的条件语句看起来比较清晰直观,我们需要创建一个脚本文件,姑且命名为:bpstrcmp.txt,将条件语句写在其中。

首先我们需要获取LoadLibrary的参数内容,我们知道LoadLibrary的参数是一个const wchar*类型的指针(姑且给他取名:pFileName,下文都用此名称),那么pFileName存在哪里呢?了解函数调用栈同学应该知道,pFileName存储在esp+4指向的栈地址空间里(esp指向栈顶,函数调用时参数会以从右到左顺序入栈(cdecl调用约),接下来call指令执行时,会将函数的返回地址,也就是call的下一条指令地址,压入栈中,此时esp会减4,所以esp+4为第一个参数地址)。接下来就是要获取pFileName,这里需要使用poi运算符,poi运算符的作用是从一个指定地址获取一个指针大小内容,我们的程序是32位的,所以取出的数据大小是4字节,如果是64位程序,那大小就是8字节。太好了,于是乎我们可以用poi(esp+4)获取到pFileName了。

有了pFileName,接下来我们还需要字符串查找函数和条件语句,和C/C++语言一样,windbg脚本语言也提供了丰富流程控制语句,如下:

.if
.else
.elif
.for
.while
.break
.continue
.do

这里我们使用.if和.else就够了,用法和C/C++类似。同样,windbg脚本提供了字符串比较运算符:

//和C语言的strcmp类似,值为-1或0或1
$scmp("String1", "String2")

//同上,只是大小写不敏感
$sicmp("String1", "String2")

//从String中查找是否包含Pattern,如果包含则值为:1,否则为:0;最变态的是它支持字符串通配符(如果想了解它的字符串通配符语法可以打开windbg,按F1打开帮助文档,然后搜索String Wildcard Syntax)
$spat("String", "Pattern")
有了这些,我们的脚本就可以顺利完成了,内容如下:

as /mu ${/v:ModuleName} poi(esp+4)
.if ($spat(@"${ModuleName}", "*rtutils.dll")) { .echo ${ModuleName}; kb; } .else { .echo not hit; gc; }

额? as /mu ${/v:ModuleName} poi(esp+4) 又是什么鬼?下面让我来一一介绍:

as命令用来定义一个别名,类似于C/C++的#define。

/mu参数:将别名设置为以null结尾的Unicode字符串。

${/v:ModuleName}:其中ModuleName即为我们定义的别名;${ } 为别名解释器,将别名扩展成它真正对应的内容;/v表示不管别名是否有定义,都保持别名字面意思不变,也就是不扩展成它真实的内容,即保持为ModuleName。

所以as /mu ${/v:ModuleName}  poi(esp+4) 的代表的含义就是:定义一个叫作ModuleName的别名,该别名等价于一个位于poi(esp+4)地址上以null结尾的Unicode字符串,在这里即为LoadLibrary的参数pFileName。

接下来我们看看$spat(@"${ModuleName}", "*rtutils.dll")语句中的内容:

${ModuleName}:其中${ }为解释器,ModuleName为别名,windbg会在执行脚本会将${ModuleName}替换为其真身(可以理解为C语言的宏扩展),在本例中即为LoadLibrary的参数pFileName。

*号:即为通配符,表示rtutils.dll前有0个或多个字符。

@"string"又是啥玩意?该语法是用来禁用掉转义符,比如字符串中包含"\r",会被当做'\'和'r'单独处理。如果不使用@"string"语法会有什么问题呢?举个栗子:

表达式$spat("C:\rtutils.dll", "*rtutils.dll")的值是0,因为'\r'被当做转义符,所以无法从C:\rtutils.dll找到字符'r',从而导致匹配不到*rtutils.dll,与预期不符

至此,脚本已经写的妥妥,那么怎么执行脚本呢?

windbg提供了$$<FilePath命令来执行脚本,于是我们的条件断点语句可以写出来了:

bp Kernel32!LoadLibraryW "$$<D:\\tool\\help\\bpstrcmp.txt"

LoadLibraryW所在的dll是Kernel32.dll,要查找API所在模块,可以msdn上搜索API名称,一般在页面下面会写明其所在模块;我们的程序是Unicode版本,所有此处应该对LoadLibraryW函数下断点,如果是多字符集版本的程序,应该对LoadLibraryA下断点


验证效果:

测试程序代码如下:

// testbp.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <Windows.h>

void loadfunc()
{
	LoadLibrary(L"c:\\temp\\rnr20.dll");
	LoadLibrary(L"c:\\temp\\RotMgr.dll");
	LoadLibrary(L"c:\\temp\\rtmcodecs.dll");
	LoadLibrary(L"c:\\temp\\rtutils.dll");
	LoadLibrary(L"c:\\temp\\RzChromaSDK64.dll");
}

int _tmain(int argc, _TCHAR* argv[])
{
	loadfunc();

	return 0;
}
首先运行windbg,配置好微软符号路径(srv*d:/Symbols*http://msdl.microsoft.com/download/symbols),然后Ctrl+E让windbg运行我们的测试程序testbp.exe,设置好条件断点,然后执行g命令,我们将看到windbg上有如下内容:
c:\temp\rtutils.dll
ChildEBP RetAddr  Args to Child              
WARNING: Stack unwind information not available. Following frames may be wrong.
0019fd7c 00411407 0041577c 0019ff28 00411078 KERNEL32!LoadLibraryW
0019fe54 00411a93 00411078 00411078 0022f000 testbp!loadfunc+0x67 [d:\projects\testbp\testbp.cpp @ 12]
0019ff28 004119c6 00000001 00a20f68 00a20ff8 testbp!wmain+0x23 [d:\projects\testbp\testbp.cpp @ 20]
0019ff78 0041180d 0019ff94 741862c4 0022f000 testbp!__tmainCRTStartup+0x1a6 [f:\sp\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 594]
0019ff80 741862c4 0022f000 741862a0 f2b86886 testbp!wmainCRTStartup+0xd [f:\sp\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 414]
0019ff94 77120fd9 0022f000 9f3c3364 00000000 KERNEL32!BaseThreadInitThunk+0x24
0019ffdc 77120fa4 ffffffff 77142f0c 00000000 ntdll!__RtlUserThreadStart+0x2f
0019ffec 00000000 00411078 0022f000 00000000 ntdll!_RtlUserThreadStart+0x1b
eax=00000000 ebx=0022f000 ecx=9f25ccb8 edx=00000000 esi=0019fd88 edi=0019fe54
eip=7418dc30 esp=0019fd80 ebp=0019fe54 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
KERNEL32!LoadLibraryW:
7418dc30 8bff            mov     edi,edi
可以看到程序被windbg断了下来,打印出了加载的dll路径和当前堆栈;当前堆栈是否就是我们要找的加载rtutils.dll的地方呢?下面我们通过查看参数内容验证一下:
0:000> du 0041577c 
0041577c  "c:\temp\rtutils.dll"
0:000> al
  Alias            Value  
 -------          ------- 
 ModuleName       c:\temp\rtutils.dll 

du 0041577c:显示0041577c地址上Unicode字符串(0041577c即为LoadLibraryW的参数地址)

al:列出当前定义的别名和它对应的真实值

从打印出的结果我们可以看到当前正在加载rtutils.dll堆栈,至此我们的条件断点成功完成它的任务。

42页Claude 3技术报告解读(Opus, Sonnet, Haiku) 在Claude 3模型中,增加了一个额外的原则到Claude的宪法中,以鼓励尊重残疾人权利,这一原则源自对集体宪法AI的研究。Claude 3模型的训练基于专有的混合数据集,包括截至2023年8月互联网上公开可用的信息,以及第三方提供的非公开数据、数据标注服务和付费承包商提供的数据,还有内部生成的数据。这些初始响应通常包含有害和有毒的内容。Claude 3模型家族在推理、编码和问答任务上展现出卓越的性能,特别是在行业标准基准测试中取得了显著的提升,证明了其在处理复杂问题和提供准确答案方面的能力。 阅读详情

相关推荐

Dev-C++使用技巧2(亲测)(更改字体和颜色、自动保存、快捷键选项、一键排版)

更改字体和颜色 顶部菜单栏->工具->编辑器选项。 更改字体 当前选项卡->显示,字体word有的基本都有,华文楷体、宋体,幼圆之类。西文字体默认字体Consloas就不错,中文的话幼圆、新宋体都挺不错。 幼圆效果: 新宋体效果: 更改颜色 当前选项卡->语法,分别单击图中的部分,然后在左边修改前景颜色就可以了。需要直接显示的修改前景颜色,背景颜色设为白色;需要选中显示的修改背景颜色,前景设为白色。 自动保存 我们有时候忘记保存或者电脑突然关机,可能会丢失代码。

魔神之云的博客 2万+

5min学会WinDBG条件断点

1.前言 很多时候我们可以使用Spy++查看某个窗口的消息,但是有一定的局限性。 以编辑控件为例,我们打开Spy++截获应用程序的EM_GETTEXTRANGE消息,却只能看到TEXTRANGE结构的指针值,看不到结构的内容。 如果想要详细查看消息的WPARAM和LPARAM参数,Spy++是无能为力的。 但是可以通过W...

systomnet的专栏 850

揭秘N531:这颗不到2毛钱的国产栅极驱动器,如何成为功率开关的“全能搭档”?

本文深入解析了国产栅极驱动器N531如何成为功率开关的“全能搭档”。针对MOSFET和IGBT等电压驱动器件在实际应用中需要大电流实现快速开关的核心痛点,N531凭借±500mA的强劲驱动能力、宽电压供电及高兼容性,有效降低开关损耗,提升系统效率与可靠性。文章通过实战案例与设计指南,阐述了这颗高性价比芯片在简化设计、降低成本方面的显著优势。

z5a6b的博客 620

windbg设置条件断点

一直以为windbg的bp断点只是简单的在某个地址上下断点,后来才发现bp断点功能很强大:除了可以设置条件断点还是windbg脚本的基础.     使用方法很简单:bp address ".if(condition){};.else{}" 具体例子形如:bp `4dbg.cpp:18` ".if(hFile>=0){};.else{gc;}"这里是对源文件中某一行下条件断点,如果句柄值大于等于0

lixiangminghate的专栏 6701

大数据架构中的数据血缘追踪技术解析

数据血缘(Data Lineage)是指数据从源头到目标的完整流转路径,它记录了数据在整个生命周期中的变化过程。在大数据架构中,数据血缘追踪技术已经成为数据治理的核心组成部分。本文旨在全面解析数据血缘追踪的技术原理、实现方法和应用实践,帮助读者深入理解这一关键技术。本文将从基础概念入手,逐步深入到技术实现细节,最后探讨实际应用和未来趋势。数据血缘的核心概念和技术原理数据血缘的数学模型和算法实现实际项目案例和代码解析主流工具和解决方案比较未来发展方向和技术挑战。

架构师的AI之路,分享AI应用开发架构的学习与实践。 688

【新华三】DHCP+TFTP+ZTP自动开局实战

设备运行ZTP功能,可以自动获取并自动加载开局文件,实现设备的免现场配置和部署,从而降低人力成本,提升部署效率。使用TFTP服务器工具进行文件的上传和下载,网上很多TFTP server软件,大家可以自行下载。3CDaemon等,可以根据使用自取所需。大家应该都了解ZTP,但是目前发现除了控制器之外仅使用ZTP开局的兄弟并不是很多,因此分享此过程方便大家批量开局,留出更多时间学习更多技术。电脑打开DHCP服务器,TFTP服务器,并通过网线连接到设备的管理口,若设备较多可以通过带外交换机等进行连接,

五大连池的镜子 4978

Windbg设置条件断点

条件断点(condition breakpoint)的是指在上面3种基本断点停下来后,执行一些自定义的判断。 在基本断点命令后加上自定义调试命令,可以让调试器在断点触发停下来后,执行调试器命令。每个命令之间用分号分割。 语法格式如: 0:000>bpAddress"j(Condition)'OptionalCommands';'gc'...

weixin_33754913的博客 419

三菱CNC数据采集实战:从SDK安装到C#代码调试全流程(附完整资源包)

本文为C#开发者提供了三菱CNC数据采集的完整实战指南。详细介绍了从获取并安装核心A2协议SDK、配置Visual Studio开发环境,到理解COM接口文档、封装C#通信类,并构建具备多设备连接与定时采集功能的WinForms应用程序的全流程。文章重点分享了网络调试、异常处理及性能优化等关键实战经验,帮助开发者高效打通工业自动化数据采集链路。

oauth7security的博客 707

Windbg 字符串条件断点

0x01 前言 Windbg 作为 Windows 下的主流调试器,除了人机交互相比其他调试器略有不足外,其他功能都是十分强大的存在。 在所有的调试器中断点功能都是必不可少的,Windbg 可以使用 bp 等命令很方便的对地址和符号下断点,这些都是非常常用的,但是对字符下断点,尤其是 unicode 字符下断点则用的比较少,但是用的好确实能解决许多问题,比如需要记录和断下一些关键 API 的参数...

CuiXY's Blog 572

AI Agent开发第49课-DIFY让AI自动预约排班后发企业微信通知-MongoDb-Redis-企业微信调用

我们的Dify会讲得很透彻,坚持喂饭级教程,从一个基本的AI自动预约客户到自动记录客户的信息再到自动判断下一步如何走全部是AI化的,这是一个真正的AI原生应用,它来自于我的一个大型物业公司用AI自动预约系统中的一部分。我们会使用这个预约流做完整的Dify例子来讲完,因为它太有代表性了。工作流中的控制反转、AI决策下一步怎么走、人为干涉、用户行为判断、外部中间件如Redis,今天我们就要讲到在Dify中调用MongoDB的数据以及企业微信通知来作为预约派单的最后一步了。

打造全国最全的AI Agent开发知识领域的博客 1752

Apache Kafka Connect任意文件读取漏洞(CVE-2025-27817)

由于Apache Kafka客户端未对用户输入进行严格验证和限制,未经身份验证的攻击者可通过构造恶意配置读取环境变量或磁盘任意内容,或向非预期位置发送请求,提升REST API的文件系统/环境/URL访问权限。(CVE-2025-27817)

iSee857的博客 2026

Windbg对特定函数下条件断点,当满足条件时再停下来方法

有时候我们需要检查一个函数执行是否成功或者执行结果是否正确,此时我们可以通过windbg给该函数下条件断点。

danxuezx的专栏 330

TC8:IPv4_HEADER_01-04

IPv4_HEADER_01: Ensure that the DUT generates an IPv4 Packet with a Total Length greater than or equal to 20 目的 确保DUT生成的IPv4报文的IP头部中的Total Length字段值大于等于20 IPv4协议头部中的Total Length字段表示整个IP数据包的长度,包括IP Header和payload之和,IP首部的长度最少就有20个字节,所以Total Length值肯定大于等于20

jasonj333 3961

WinDBG 调试技巧之设置条件断点

WinDBG 调试技巧之设置条件断点 Setting a Conditional Breakpoint Conditional breakpoints can be veryuseful when you are trying to find bugs in your code. They cause a break tooccur only if a specifi

itmes的专栏 8092

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

windbg条件断点

假设源文件a.cpp如下所示:void main(){    int sum = 0;    for (int i = 0; i    {        sum += i;    }} 要在第6行下一个条件断点,当i>=6的时候断点生效,则可以用如下命令:bp `a.cpp:6` ".if(poi(i)解释如下:.if, .else是windbg条件判定命令,格式为.if(条件) {表达式1} .

mountaintai二世的运动场 4027

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

windbg条件断点II

    想逆向一个程序,发现很久不用条件断点居然生疏了,只能先写个示例程序温故一下,程序如下: int condbp(char* str,int val) { printf("%s-%d\n",str,val); return 0; } int _tmain(int argc, _TCHAR* argv[]) { int idx = 0; char* strtab[3]={"abc"...

lixiangminghate的专栏 713

深度学习工具包 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")

调试Bug的神兵利器:通过WinDbg条件断点收集Log

前段时间花了几天一直在用WinDbg调试一个比较棘手的Bug。这个Bug是C# Team那边发现的,他们的Testcase跑大概10分钟左右会出一个在CLR内部的ASSERT。比较难调试的主要原因在于ASSERT表明一个全局的数据结构出现了问题,本来不应该用完的数组却已经用完了(因为按照设计,这个数组是边使用边清理的,是不会用完的)。初步想到的有下面几种方案来调试: 1. 设置数据断点 2.

张羿的优快云专栏 1万+

windbg 使用条件断点 ba

背景,我今天要调试一个大程序,里边的一个变量改变了,但代码量实在太大, 如果想监控一个类的成员变量是否等于4,怎么办呢? #pragma once class CMyTest { public: CMyTest() { m_abc = 0; } void set(int a) { m_abc = a; }; int m_abc; }; //调用的地方就是 CMytest test; for( int i = 0; i< 100...

yangzm的专栏 544

WinDBG条件断点

http://hi.baidu.com/6908270270/blog/item/0d7fe423fc8612409922ed04.html 最近需要在访问指定文件时中断下来,但不知道如何下断,在网上搜索了一番无果,只好自己摸索了。听大侠说windbg的条件断点功能异常强大,可以实现,不禁心痒,特尝试一番,顺便熟悉一下windbg的脚本语法。 先来了解简单的,得到当前访问的文件名 先写段

killcpp的专栏 2617

通过WinDbg条件断点收集Log

前段时间花了几天一直在用WinDbg调试一个比较棘手的Bug。这个Bug是C# Team那边发现的,他们的Testcase跑大概10分钟左右会出一个在CLR内部的ASSERT。比较难调试的主要原因在于ASSERT表明一个全局的数据结构出现了问题,本来不应该用完的数组却已经用完了(因为按照设计,这个数组是边使用边清理的,是不会用完的)。初步想到的有下面几种方案来调试:1. 设置数据断点2. 一步一步

ithzhang 4304

如何写windbg高级脚本---以访问文件的windbg脚本为例说明

标 题:如何写windbg高级脚本---以访问文件的windbg脚本为例说明 作 者:悠扬笛曲 时 间:2009-03-17 10:27 链 接:http://bbs.pediy.com/showthread.php?t=83946 最近需要在访问指定文件时中断下来,但不知道如何下断,在网上搜索了一番无果,只好自己摸索了。听大侠说windbg的条件断点功能异常强大,可以实现,不禁

superliuxing的专栏 819

windbg字符串比较条件断点

windbg字符串比较条件断点 目的:     当寄存器指向字符串为与某个字符串相同时,断下程序。 问题关键:     需要把寄存器指向的字符串取出来比较,而别名可以做到这一点。 测试源码: void main() { char buf[] = "shengfu"; char* p = buf; __asm mov eax, p } 断点:  1 e 0040141

TMS_LI的专栏 3549

VSDebug、Ollydbg、WinDbg字符串条件断点设置方法

字符串断点在下断点时也是一个比较常用的功能。 不过网上介绍字符串断点设置技巧的文章很少,有的也不准确。 其实他们设置的方法整体来看比较简单。 VSDebug VSDebug 微软VS自带调试器套件,对字符串断点的支持依然强大。 Vs支持在断点条件中使用字符串比较函数。 ASCII字符集字符串断点设置方法: strcmp(pzString, "DDLX_CHAR") ==

点点灵犀 3148

windbg命令

监视窗口: @@(poi(0ffb6bae0)) 显示0ffb6bae0指向的值. 具体可以参照windbg的命令语法写一个很复杂的命令. @@(eax) 监视器窗口添加eax的值 @$peb @$teb @$ip 监视窗口添加peb teb eip的值 @$proc 监视窗口添加 eprocess的结构信息 条件断点: bp kerne

zxcdebug的专栏 3157

WinDBG 设置条件断点

Conditional breakpoints can be veryuseful when you are trying to find bugs in your code. They cause a break tooccur only if a specific condition is satisfied. 当你在尝试找到你代码中的bug时,条件断点非常有用。当某个特殊条件满足时它才

lixiangminghate的专栏 1951
上一篇: 获取文件信息
下一篇: WEBKIT/CEF DOM树创建过程分析
CButtonST
博客等级 码龄16年 42粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值