- 浏览: 378308 次
- 性别:
- 来自: 苏州
-
文章分类
- 全部博客 (335)
- C++ (190)
- 设计模式 (43)
- 数据库技术 (5)
- 网络编程 (11)
- 自动化测试 (6)
- Linux (13)
- OpenSSL (10)
- MS Crypt API (5)
- SCM (2)
- English (4)
- Android (10)
- EMV规范 (1)
- Saturn Platform (0)
- C (10)
- SQL (2)
- ASP.NET (3)
- 英语口语学习 (3)
- 调试工具 (21)
- 编译技术 (5)
- UML (1)
- 项目管理 (5)
- 敏捷开发 (2)
- Http Server (6)
- 代码审查、代码分析 (5)
- 面试基础 (10)
- 重点知识 (16)
- STL (6)
- Efficient C++资料 (8)
- 数据结构和算法 (7)
- 读书笔记 (0)
- 开源项目 (4)
- 多线程 (2)
- Console App (6)
- 个人开源项目 (4)
- IBM DevelopWorks (4)
- Java (16)
- 内存泄漏相关调试和检测 (13)
- 软件测试相关技术 (2)
- C# (11)
- Apple Related (1)
- 软件测试和管理 (2)
- EMV (1)
- Python (1)
- Node.js (6)
- JavaScript (5)
- VUE (1)
- Frontend (1)
- Backend (4)
- RESTful API (3)
- Firebase (3)
最新评论
-
u013189503:
来个密码吧
[C++][Logging] 项目中写日志模块的实现 -
wyf_vc:
来个密码啊!!
[C++][Logging] 项目中写日志模块的实现
参考资料
http://download.csdn.net/download/BlueMap/2518291
http://www.cppblog.com/sandy/archive/2008/08/18/59260.html
http://www.codeproject.com/Articles/108529/LeakDiag-An-Effective-Memory-Leak-Analysis-Tool
写一个定时抓log的AP:LeakDiagAutoLog.exe
LeakDiag使用手记
1.在IDE工程选项里面配置Release版本也生成调试信息,发布时,将pdb文件和exe文件一起发布。
2.程序运行后,打开LeakDiag,设置Symbol path
3.定期Log下目标进程的内存分配情况,通过LDGraph打印分配增长情况,来发现内存泄漏
优点:同hookapi方法,非侵入式修改,无需做任何代码改动。跟踪全面。可视化分析堆栈一览无余!
缺点:对性能有影响,hook分配加锁,遍历堆栈。但是不会占用目标进程的自身内存。
安装好,默认是在c:\leakdiag
然后写一个测试程序来测试
在LeakDiag中选择aaa.exe
然后选择Windows Heap Allocator来跟踪heap的使用,按start开始,等一会按log,然后再stop
会在c:\leakdiag\Logs下面生成一个log
关键的部分是
其中numallocs是分配的次数,size是每次分配的大小,frame则是leak的时候的call stack
这里的stack只显示了binary,是因为symbol没有配好
把对应的pdb文件路径加到[Tools]-[Option]-Symbol search path,就能得到
由test.cpp line 8引起的memory leak.
http://download.csdn.net/download/BlueMap/2518291
http://www.cppblog.com/sandy/archive/2008/08/18/59260.html
http://www.codeproject.com/Articles/108529/LeakDiag-An-Effective-Memory-Leak-Analysis-Tool
写一个定时抓log的AP:LeakDiagAutoLog.exe
BOOL CLeakDiagAutoLogDlg::DoAutoLogging() { CString strData; m_pMsgEdit->GetWindowText(strData); HWND m_pHwnd = ::FindWindow(NULL, _T("LeakDiag")); if (m_pHwnd != NULL) { HWND m_pHwnLogBtnCtrl = ::FindWindowEx(m_pHwnd, NULL, _T("Button"), _T("Log")); if (m_pHwnLogBtnCtrl != NULL) { long id = ::GetDlgCtrlID(m_pHwnLogBtnCtrl); ::PostMessage(m_pHwnd, WM_COMMAND, MAKELONG(id, BN_CLICKED), NULL); } else { strData += _T("m_pHwnLogBtnCtrl is NULL\r\n"); m_pMsgEdit->SetWindowText(strData); return FALSE; } } else { strData += _T("m_pHwnd is NULL!\r\n"); m_pMsgEdit->SetWindowText(strData); return FALSE; } return TRUE; // HWND m_pHwnStartControl = ::FindWindowEx(m_pHwnd, NULL, _T("Button"), _T("Start")); // ASSERT(m_pHwnStartControl != NULL); // long id = ::GetDlgCtrlID(m_pHwnStartControl); // ::PostMessage(m_pHwnd, WM_COMMAND, MAKELONG(id,BN_CLICKED), NULL); } void CLeakDiagAutoLogDlg::OnBnClickedRunBtn() { // TODO: Add your control notification handler code here UpdateData(TRUE); if (0 == m_dwTimeSpan) { m_dwTimeSpan =1; } CEdit* pEdit = static_cast<CEdit*>(GetDlgItem(IDC_RUN_BTN)); if (!m_bTimer) { SetTimer(1, UINT(m_dwTimeSpan*1000), NULL); m_bTimer = TRUE; pEdit->SetWindowText(_T("Stop")); } else { KillTimer(1); m_bTimer = FALSE; pEdit->SetWindowText(_T("Start")); } UpdateData(FALSE); } void CLeakDiagAutoLogDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: Add your message handler code here and/or call default CTime cTime = CTime::GetCurrentTime(); CString strTime = cTime.Format("[%Y-%m-%d %H:%M:%S] ");//display YYYY:MM:DD HH:MM:SS switch (nIDEvent) { case 1: { if (DoAutoLogging()) { CString strData; CString strTemp; strTemp.Format("[RUN = %ld] DoAutoLogging", ++m_dwTotalRun); m_pMsgEdit->GetWindowText(strData); strData += strTime; strData += strTemp; strData += "\r\n"; m_pMsgEdit->SetWindowText(strData); } break; } case 2: default: { break; } } CDialog::OnTimer(nIDEvent); }
LeakDiag使用手记
1.在IDE工程选项里面配置Release版本也生成调试信息,发布时,将pdb文件和exe文件一起发布。

2.程序运行后,打开LeakDiag,设置Symbol path

3.定期Log下目标进程的内存分配情况,通过LDGraph打印分配增长情况,来发现内存泄漏

优点:同hookapi方法,非侵入式修改,无需做任何代码改动。跟踪全面。可视化分析堆栈一览无余!
缺点:对性能有影响,hook分配加锁,遍历堆栈。但是不会占用目标进程的自身内存。
安装好,默认是在c:\leakdiag

然后写一个测试程序来测试
#include <stdio.h> #include <windows.h> int main() { while(1) { char *c = new char[10]; printf("%s",c); Sleep(1000); } return 0; }
在LeakDiag中选择aaa.exe
然后选择Windows Heap Allocator来跟踪heap的使用,按start开始,等一会按log,然后再stop
会在c:\leakdiag\Logs下面生成一个log
关键的部分是
<LEAKS ver="1.25.28.2201"> <STACK numallocs="05" size="048" totalsize="0240"> <STACKSTATS> <SIZESTAT size="048" numallocs="05"/> <HEAPSTAT handle="340000" numallocs="05"/> </STACKSTATS> <FRAME num="0" dll="aaa.exe" function="" filename="" line="" addr="0x407a72" offset="0x00007A72" /> <FRAME num="1" dll="aaa.exe" function="" filename="" line="" addr="0x402ff2" offset="0x00002FF2" /> <FRAME num="2" dll="aaa.exe" function="" filename="" line="" addr="0x402df9" offset="0x00002DF9" /> <FRAME num="3" dll="aaa.exe" function="" filename="" line="" addr="0x402dd6" offset="0x00002DD6" /> <FRAME num="4" dll="aaa.exe" function="" filename="" line="" addr="0x40112f" offset="0x0000112F" /> <FRAME num="5" dll="aaa.exe" function="" filename="" line="" addr="0x401038" offset="0x00001038" /> <FRAME num="6" dll="aaa.exe" function="" filename="" line="" addr="0x401269" offset="0x00001269" /> <FRAME num="7" dll="KERNEL32.dll" function ="GetSortTablesFileInfo" offset="0xC" filename="" line="" addr="0x7C5989D5" /> <STACKID>00524008</STACKID> </STACK> </LEAKS>
其中numallocs是分配的次数,size是每次分配的大小,frame则是leak的时候的call stack
这里的stack只显示了binary,是因为symbol没有配好
把对应的pdb文件路径加到[Tools]-[Option]-Symbol search path,就能得到
<LEAKS ver="1.25.28.2201"> <STACK numallocs="06" size="048" totalsize="0288"> <STACKSTATS> <SIZESTAT size="048" numallocs="06"/> <HEAPSTAT handle="340000" numallocs="06"/> </STACKSTATS> <FRAME num="0" dll="aaa.exe" function ="_heap_alloc_base" offset="0xC2" filename="malloc.c" line="200" addr="0x407A72" /> <FRAME num="1" dll="aaa.exe" function ="_heap_alloc_dbg" offset="0x1A2" filename="dbgheap.c" line="378" addr="0x402FF2" /> <FRAME num="2" dll="aaa.exe" function ="_nh_malloc_dbg" offset="0x19" filename="dbgheap.c" line="248" addr="0x402DF9" /> <FRAME num="3" dll="aaa.exe" function ="_nh_malloc" offset="0x16" filename="dbgheap.c" line="197" addr="0x402DD6" /> <FRAME num="4" dll="aaa.exe" function ="operator new" offset="0xF" filename="new.cpp" line="24" addr="0x40112F" /> <FRAME num="5" dll="aaa.exe" function ="main" offset="0x28" filename="D:\Test\aaa\test.cpp" line="8" addr="0x401038" /> <FRAME num="6" dll="aaa.exe" function ="mainCRTStartup" offset="0xE9" filename="crt0.c" line="206" addr="0x401269" /> <STACKID>00524008</STACKID> </STACK> </LEAKS>
由test.cpp line 8引起的memory leak.
- LeakDiag内存泄漏检测工具leakdiag和配套图形化查看工具LDGrapher.zip (1.5 MB)
- 下载次数: 3
- How_To_Use_LeakDiag___LDGrapher.zip (655.8 KB)
- 下载次数: 1
- LeakDiagAutoLog.zip (847.6 KB)
- 下载次数: 1
- LeakDiagAutoLog_SRC.zip (915.5 KB)
- 下载次数: 0
发表评论
-
FreeRTOS
2022-03-05 16:31 264Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 431https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1369https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 497https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 595// this function create a bmp ... -
[轉] android默认debug.keystore的密码
2017-12-12 11:14 1085http://blog.csdn.net/leehong200 ... -
Android NDK搭建環境
2017-11-27 13:25 617https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 6078583相关资料,整理中... -
Java反编译工具 - Java Decompiler
2017-06-21 20:14 507http://jd.benow.ca/ JD-GUI is ... -
JAVA环境变量配置
2017-06-19 13:56 382参考Link http://www.cnblogs.com/x ... -
Java高级应用之JNI
2017-06-19 09:00 619参考link http://www.cnblogs.com/l ... -
Windows7上使用VMWare搭建iPhone开发环境
2017-05-17 08:49 487Windows7上使用VMWare搭建iPhone开发环境 h ... -
C++实现ping功能
2017-04-18 11:21 2210基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 9301 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1624OpenSSL命令---rsautl http://blog. ... -
[Platform Builder] 设置SVM OS build Env
2016-11-10 11:39 01 copy one OSDesign Project to ... -
[Windows] System Error Codes(GetLastError )0-----5999
2016-10-26 13:28 1898ERROR_SUCCESS 0 (0x0) T ... -
WinCE 内存检测
2016-09-30 16:30 674Wince内存泄露检测工具Application Verifi ... -
开源Windows驱动程序框架
2016-09-17 21:35 896转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1950转自 http://blog.csdn.net/slixinx ...
相关推荐
内容概要:本文详细介绍了基于SpringBoot和Vue开发的养老院管理系统的具体实现细节。该系统采用前后端不分离的架构,旨在快速迭代并满足中小项目的开发需求。文中涵盖了多个关键技术点,如数据库设计(组合唯一约束、触发器)、定时任务(@Scheduled、@Async)、前端数据绑定(Vue的条件渲染和动态class绑定)、权限控制(RBAC模型、自定义注解)以及报表导出(SXSSFWorkbook流式导出)。此外,还讨论了开发过程中遇到的一些常见问题及其解决方案,如CSRF防护、静态资源配置、表单提交冲突等。 适合人群:具备一定Java和前端开发经验的研发人员,尤其是对SpringBoot和Vue有一定了解的开发者。 使用场景及目标:适用于需要快速开发中小型管理系统的团队,帮助他们理解如何利用SpringBoot和Vue进行全栈开发,掌握前后端不分离架构的优势和注意事项。 其他说明:文章不仅提供了详细的代码示例和技术要点,还分享了许多实用的小技巧和避坑指南,有助于提高开发效率和系统稳定性。
家族企业如何应对人才流失问题?
员工关怀制度.doc
内容概要:本文详细探讨了对传统蚁群算法进行改进的方法,特别是在路径规划领域的应用。主要改进措施包括:采用排序搜索机制,即在每轮迭代后对所有路径按长度排序并只强化前20%的优质路径;调整信息素更新规则,如引入动态蒸发系数和分级强化策略;优化路径选择策略,增加排序权重因子;以及实现动态地图调整,使算法能够快速适应环境变化。实验结果显示,改进后的算法在收敛速度上有显著提升,在复杂地形中的表现更加稳健。 适合人群:从事路径规划研究的技术人员、算法工程师、科研工作者。 使用场景及目标:适用于需要高效路径规划的应用场景,如物流配送、机器人导航、自动驾驶等领域。目标是提高路径规划的效率和准确性,减少不必要的迂回路径,确保在动态环境中快速响应变化。 其他说明:改进后的蚁群算法不仅提高了收敛速度,还增强了对复杂环境的适应能力。建议在实际应用中结合可视化工具进行调参,以便更好地观察和优化蚂蚁的探索轨迹。此外,还需注意避免过度依赖排序机制而导致的过拟合问题。
内容概要:本文详细介绍了利用粒子群优化(PSO)算法解决配电网中分布式光伏系统的选址与定容问题的方法。首先阐述了问题背景,即在复杂的配电网环境中选择合适的光伏安装位置和确定合理的装机容量,以降低网损、减小电压偏差并提高光伏消纳效率。接着展示了具体的PSO算法实现流程,包括粒子初始化、适应度函数构建、粒子位置更新规则以及越界处理机制等关键技术细节。文中还讨论了目标函数的设计思路,将多个相互制约的目标如网损、电压偏差和光伏消纳通过加权方式整合为单一评价标准。此外,作者分享了一些实践经验,例如采用前推回代法进行快速潮流计算,针对特定应用场景调整权重系数,以及引入随机波动模型模拟光伏出力特性。最终实验结果显示,经过优化后的方案能够显著提升系统的整体性能。 适用人群:从事电力系统规划与设计的专业人士,尤其是那些需要处理分布式能源集成问题的研究人员和技术人员。 使用场景及目标:适用于希望深入了解如何运用智能优化算法解决实际工程难题的人士;旨在帮助读者掌握PSO算法的具体应用方法,从而更好地应对配电网中分布式光伏系统的选址定容挑战。 其他说明:文中提供了完整的Matlab源代码片段,便于读者理解和复现研究结果;同时也提到了一些潜在改进方向,鼓励进一步探索和创新。
内容概要:本文详细介绍了丰田Prius2004永磁同步电机的设计流程,涵盖从初始参数计算到最终温升仿真的各个环节。首先利用Excel进行基本参数计算,如铁芯叠厚、定子外径等,确保设计符合预期性能。接着使用Maxwell进行参数化仿真,通过Python脚本自动化调整磁钢尺寸和其他关键参数,优化电机性能并减少齿槽转矩。随后借助橡树岭实验室提供的实测数据验证仿真结果,确保模型准确性。最后采用MotorCAD进行温升仿真,优化冷却系统设计,确保电机运行安全可靠。文中还分享了许多实用技巧,如如何正确设置材料参数、避免常见的仿真错误等。 适合人群:从事电机设计的专业工程师和技术人员,尤其是对永磁同步电机设计感兴趣的读者。 使用场景及目标:适用于希望深入了解永磁同步电机设计全过程的技术人员,帮助他们在实际工作中提高设计效率和精度,解决常见问题,优化设计方案。 其他说明:文章提供了丰富的实战经验和具体的操作步骤,强调了理论与实践相结合的重要性。同时提醒读者注意一些容易忽视的细节,如材料参数的选择和仿真模型的准确性。
内容概要:本文详细介绍了基于DSP28335的单相逆变器的设计与实现,涵盖了多个关键技术模块。首先,ADC采样模块用于获取输入电压和电流的数据,确保后续控制的准确性。接着,PWM控制模块负责生成精确的脉宽调制信号,控制逆变器的工作状态。液晶显示模块则用于实时展示电压、电流等重要参数。单相锁相环电路实现了电网电压的频率和相位同步,确保逆变器输出的稳定性。最后,电路保护程序提供了过流保护等功能,保障系统的安全性。每个模块都有详细的代码示例和技术要点解析。 适合人群:具备一定嵌入式系统和电力电子基础知识的研发人员,尤其是对DSP28335感兴趣的工程师。 使用场景及目标:适用于单相逆变器项目的开发,帮助开发者理解和掌握各个模块的具体实现方法,提高系统的可靠性和性能。 其他说明:文中不仅提供了具体的代码实现,还分享了许多调试经验和常见问题的解决方案,有助于读者更好地理解和应用相关技术。
SecureCRT安装包
内容概要:本文详细介绍了如何利用C#、WPF和MVVM模式构建一个大屏看板3D可视化系统。主要内容涵盖WPF编程设计、自定义工业控件、数据库设计、MVVM架构应用以及典型的三层架构设计。文中不仅提供了具体的代码实例,还讨论了数据库连接配置、3D模型绑定、依赖属性注册等关键技术细节。此外,文章强调了项目开发过程中需要注意的问题,如3D坐标系换算、MVVM中命令传递、数据库连接字符串加密等。 适合人群:具备一定C#编程基础,对WPF和MVVM模式有一定了解的研发人员。 使用场景及目标:适用于希望深入了解WPF和MVVM模式在实际项目中应用的开发者,特别是那些从事工业控制系统、数据可视化平台开发的专业人士。通过学习本文,读者可以掌握如何构建高效、稳定的大屏看板3D可视化系统。 其他说明:本文提供的设计方案和技术实现方式,可以帮助开发者更好地理解和应用WPF和MVVM模式,同时也能为相关领域的项目开发提供有价值的参考。
基于ssm的系统设计,包含sql文件(Spring+SpringMVC+MyBatis)
内容概要:本文详细介绍了利用COMSOL进行非厄米超表面双参数传感器的设计与实现。首先,通过构建超表面单元并引入虚部折射率,实现了PT对称系统的增益-损耗交替分布。接着,通过频域扫描和参数化扫描,捕捉到了复频率空间中的能级劈裂现象,并找到了奇异点(Exceptional Point),从而显著提高了传感器对微小扰动的敏感度。此外,文章探讨了双参数检测的独特优势,如解耦温度和折射率变化的能力,并展示了其在病毒检测、工业流程监控等领域的潜在应用。 适合人群:从事光学传感器研究的专业人士,尤其是对非厄米系统和COMSOL仿真感兴趣的科研人员。 使用场景及目标:适用于需要高精度、多参数检测的应用场合,如生物医学检测、环境监测等。目标是提高传感器的灵敏度和分辨率,解决传统传感器中存在的参数交叉敏感问题。 其他说明:文中提供了详细的建模步骤和代码片段,帮助读者理解和重现实验结果。同时,强调了在建模过程中需要注意的关键技术和常见问题,如网格划分、参数设置等。
怎样健全员工福利体系.docx
离职证明范本.doc
6538b79724855900a9c930904a302920.part6
员工离职单.doc
内容概要:本文详细介绍了在COMSOL中进行超材料异常折射仿真的关键技术。首先解释了异常折射现象及其产生的原因,接着通过具体代码展示了如何利用相位梯度和结构色散精确计算折射角。文中还讨论了边界条件的设置、网格划分的优化以及参数化扫描的应用。此外,提供了多个实用脚本和技巧,帮助提高仿真的精度和效率。最后强调了验证结果的重要性和一些常见的注意事项。 适合人群:从事电磁仿真研究的专业人士,尤其是对超材料和异常折射感兴趣的科研人员和技术开发者。 使用场景及目标:适用于需要深入理解和解决超材料中异常折射问题的研究项目。主要目标是掌握COMSOL中异常折射仿真的完整流程,确保仿真结果的准确性并优化计算性能。 其他说明:文章不仅提供了详细的代码示例和技术细节,还分享了许多实践经验,有助于读者更好地应对实际仿真过程中可能出现的问题。
招聘工作数据分析表.xls
platform-tools-latest-windows.zip
个人资料临时存储QT资源