不能设置断点的检查步骤

转自:http://blog.youkuaiyun.com/Donjuan/article/details/3863241  
在调试程序的时候,有的时候你会发现设置的断点不起作用,而且更糟糕的是,一般碰到这种情况的时候都是非常紧急或者是加班到夜已深、人寂静的时候了。正是应了那句玩笑话:“机器机器,越急越气!”。一般发生断点不起作用的话:

1.         你首先要判断的是断点是否真的设置上了?

a)         如果在Visual Studio里面,你的断点符号是一个实心圆,那么断点的确是设置上了,你要判断的是设置断点的语句是否真的被执行到了,这种情况的解决方案不在本文讨论当中。

b)         如果在Visual Studio里面,你的断点符号是一个空心圆,那么说明断点被你禁用了,那么启用就行了。

c)         如果在Visual Studio里面,你的断点符号是一个空心圆并且还带了一个小感叹号的话,如下图所示:

 

那么说明你的调试符号文件没有被正确加载,参看我这篇文档了解什么是符号文件:http://blog.youkuaiyun.com/Donjuan/archive/2008/12/05/3454597.aspx

2.         如果确定是符号文件没有加载正确,单击“调试”-- >“窗口”-- >“模块”列出程序加载的所有DLL文件,模块窗口还会列出每一个DLL文件的符号文件加载信息:

 

3.         由于我们设置的断点的源文件是TestWPF.exe源代码的一部分,从第二列里面可以看出Visual Studio没有找到TestWPF.exe的PDB文件,为了查看Visual Studio尝试在哪些路经加载我们的符号文件,可以右键单击TestWPF.exe那一行,在弹出菜单里面选择“符号文件加载信息”,打开的窗口里面详细显示了为什么Visual studio没有成功加载TestWPF.exe的PDB文件,这是一个输出的例子:

E:/Workspace/Study/Forum/Test/TestWPF/bin/Debug/TestWPF.pdb: Cannot find or open the PDB file.

E:/Workspace/Study/Forum/Test/TestWPF/obj/Debug/TestWPF.pdb: Cannot find or open the PDB file.

C:/WINDOWS/symbols/exe/TestWPF.pdb: Cannot find or open the PDB file.

C:/WINDOWS/exe/TestWPF.pdb: Cannot find or open the PDB file.

C:/WINDOWS/TestWPF.pdb: Cannot find or open the PDB file.

4.         如果你有PDB文件,只要在右键菜单里面选择“加载符号文件”选项在打开的对话框里面输入符号文件的路径就可以了。如果你选择了符号文件,Visual studio还是报错说符号文件不能加载的话,那么请确认符号文件是否和调试的模块相匹配,因为不匹配的话,调试器就没有办法正确设置断点,没有正确显示变量的值。

a)         判断符号文件与模块是否匹配最简便的方法就是察看两者的创建时间是否相同,如果不同的话,那就肯定是不匹配的。

b)         如果时间相同,那有可能是因为模块文件是调试(Debug)版本,而符号文件是发布(Release)版本,这个时候,你可以用windbg自带的symchk程序来检查一下。命令的语法是:

Symchk.exe <模块的完整路径> /s <符号文件所在的文件夹>

下面两个图片分别是符号文件不匹配和匹配的输出示例:

 

符号文件和模块不匹配

 

符号文件和模块匹配的情形

 

c)         或者你有源代码的话,那就干脆重新编译一次就完了—这是最简单的方法。

5.         如果在“模块”窗口里面显示的是“跳过加载符号文件”,那么说明Visual studio默认认为这个模块的源代码不是程序的一部分,比如是程序引用到的一些.NET Framework的Assembly文件,因此它认为你不必要给这个模块排错。但是有的时候你需要看看堆栈信息或者需要单步跟踪进.NET Framwork的函数里面看看为什么调用会出错,因此你可以通过单击VS菜单里面的“工具”-- >“选项”-- >“调试”-- >“通用(General)”,勾掉“只调试我的代码”复选框,点击确定就可以了:

<think>我们讨论如何设置断点检查bug。在不同的编程环境和语言中,设置断点的方法有所不同。这里我将以常见的几种开发环境为例,展示如何设置断点进行调试。###1.在Python中使用pdb设置断点Python标准库提供了pdb模块用于调试。以下是在代码中设置断点的方法:```python#示例代码:计算斐波那契数列deffibonacci(n):ifn<=0:return0elifn==1:return1else:returnfibonacci(n-1)+fibonacci(n-2)#在需要设置断点的地方插入以下代码importpdb;pdb.set_trace()#Python3.7之前#或者使用breakpoint()#Python3.7及之后result=fibonacci(5)print(result)```运行上述代码时,程序会在`pdb.set_trace()`处暂停,进入pdb调试环境。常用命令:-`n`(next):执行下一行-`c`(continue):继续执行直到下一个断点-`s`(step):进入函数调用-`l`(list):显示当前代码位置-`p<expression>`(print):打印表达式的值-`q`(quit):退出调试器###2.在VSCode中设置断点VSCode是流行的代码编辑器,支持多种语言的调试。步骤:1.打开要调试的Python文件2.在行号左侧单击设置断点(红色圆点)3.切换到调试视图(左侧活动栏的虫子图标)4.点击绿色箭头启动调试示例launch.json配置:```json{"version":"0.2.0","configurations":[{"name":"Python:CurrentFile","type":"python","request":"launch","program":"${file}","console":"integratedTerminal","stopOnEntry":false}]}```###3.在PyCharm中设置断点PyCharm是强大的PythonIDE,设置断点方法:1.在行号右侧点击设置断点2.右键点击断点设置条件(例如:当`x>10`时暂停)3.点击右上角的调试按钮(绿色虫子图标)启动调试###4.在浏览器中调试JavaScript在Chrome开发者工具中:1.打开开发者工具(F12)2.切换到Sources标签页3.找到需要调试的JavaScript文件4.在行号上单击设置断点5.刷新页面或触发事件,程序会在断点处暂停条件断点设置:-右键点击断点,选择"Editbreakpoint"-输入条件表达式,如`count>5`###5.在Java中使用Eclipse设置断点Eclipse是常用的JavaIDE:1.在编辑器行号处双击设置断点2.右键点击断点设置属性(命中计数、条件等)3.以调试模式运行程序(右键项目->DebugAs->JavaApplication)###6.远程调试(以Java为例)对于运行在远程服务器上的Java程序:```bash#启动Java程序时添加调试参数java-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005-jarapp.jar```在IDE中创建远程调试配置:-主机:远程服务器IP-端口:5005-连接类型:Socket###7.在Node.js中设置断点使用内置调试器或ChromeDevTools:```bashnode--inspectapp.js```然后在Chrome中打开`chrome://inspect`,点击"OpendedicatedDevToolsforNode"进行调试。###调试技巧总结1.**条件断点**:当满足特定条件时才暂停2.**日志点**(VSCode):在断点处记录消息而不暂停(右键断点->编辑->勾选"LogMessage")3.**异常断点**:在未捕获异常时暂停(在IDE中配置)4.**函数断点**:当进入特定函数时暂停(在调用栈或函数名处设置)5.**数据断点**(C++/Java):当变量值改变时暂停(在变量上设置)###示例:条件断点(VSCode)```json//在launch.json中添加配置"breakpoints":[{"path":"${workspaceFolder}/app.py","line":10,"condition":"x>100"}]```###示例:在PyCharm中设置异常断点1.进入Run->ViewBreakpoints2.点击"+"->PythonExceptionBreakpoint3.选择异常类型(如AssertionError)###调试复杂问题的方法1.**二分法定位**:在代码中间设置断点,逐步缩小范围2.**监视表达式**:持续跟踪关键变量的值3.**调用栈检查**:查看函数调用路径4.**内存分析**:检查内存泄漏(使用专用工具)5.**性能分析**:结合性能分析工具定位瓶颈---§§相关问题§§:1.如何在Docker容器中调试应用程序?2.如何使用GDB调试C/C++程序中的内存错误?3.在分布式系统中如何设置断点进行调试?4.如何调试多线程程序中的竞态条件?</think>## 如何设置断点检查 Bug:全面调试指南 断点是调试过程中最核心的工具之一,它允许你在代码特定位置暂停执行,检查程序状态。以下是不同语言和环境的断点设置方法: ### Python 调试(使用 pdb 和 IDE) #### 1. Python 内置 pdb 调试器 ```python # 在代码中设置断点 def calculate_average(numbers): import pdb; pdb.set_trace() # 手动设置断点 total = sum(numbers) return total / len(numbers) # 运行调试 # $ python -m pdb your_script.py ``` pdb 常用命令: - `n` (next):执行下一行 - `s` (step):进入函数调用 - `c` (continue):继续执行直到下一个断点 - `l` (list):显示当前代码位置 - `p <expression>` (print):打印表达式值 - `q` (quit):退出调试器 #### 2. VS Code 断点设置 1. 在行号左侧点击设置断点(红色圆点) 2. 按 F5 启动调试 3. 使用调试工具栏控制执行 条件断点设置: ```python # 右键点击断点 → 编辑断点 → 输入条件 # 例如:len(numbers) > 10 ``` ### JavaScript/Node.js 调试 #### 1. Chrome DevTools 调试 ```javascript function processOrder(order) { debugger; // 自动在DevTools中暂停 const total = order.items.reduce((sum, item) => sum + item.price, 0); return total * (1 - order.discount); } // 在浏览器中: // 1. 打开开发者工具(F12) // 2. 切换到Sources标签页 // 3. 找到文件并设置断点 ``` #### 2. Node.js 调试 ```bash # 启动调试 node --inspect your-script.js # 在Chrome中打开 chrome://inspect → 点击"Open dedicated DevTools for Node" ``` ### Java 调试(使用 IntelliJ IDEA) 1. 在代码行号左侧点击设置断点 2. 右键断点设置条件: - 条件表达式(如 `count > 5`) - 日志表达式(不暂停执行) - 命中次数(第 N 次命中时暂停) 3. 以调试模式运行程序(Shift+F9) ### 高级断点技巧 #### 1. 异常断点(捕获未处理异常) - **PyCharm**:Run → View Breakpoints → 勾选"Python Exception" - **VS Code**:调试侧边栏 → 断点 → 勾选"未捕获的异常" - **IntelliJ**:Run → View Breakpoints → Exception Breakpoints #### 2. 函数断点 ```javascript // Chrome DevTools // 在Sources标签页 → 右侧Breakpoints → 添加函数断点 function breakOnFunction(fnName) { const fn = window[fnName]; window[fnName] = function() { debugger; return fn.apply(this, arguments); }; } breakOnFunction('calculateTotal'); // 在calculateTotal调用时暂停 ``` #### 3. 数据断点(监视变量变化) - **C++** (GDB):`watch variable_name` - **Chrome**:Sources → Scope → 右键变量 → "Break on value change" - **VS Code** (C/C++):在WATCH窗口添加`&variable`,右键设置数据断点 ### 调试工作流程 1. **重现问题**:确定可靠复现问题的步骤 2. **设置初始断点**:在可疑区域开始位置设置 3. **单步执行**: - Step Over (F10):执行当前行 - Step Into (F11):进入函数调用 - Step Out (Shift+F11):跳出当前函数 4. **检查状态**: - 变量值 - 调用栈 - 线程状态 5. **修改值测试**:运行时更改变量值测试假设 6. **条件断点**:缩小问题范围 7. **日志点**:不暂停执行但记录信息 ### 调试复杂问题 #### 1. 竞态条件调试 ```c++ // C++ 示例:设置数据断点 #include <iostream> #include <thread> int sharedData = 0; void increment() { for(int i = 0; i < 1000000; ++i) { sharedData++; // 在此处设置数据断点 } } int main() { std::thread t1(increment); std::thread t2(increment); t1.join(); t2.join(); std::cout << "Final value: " << sharedData << std::endl; return 0; } // GDB命令: // (gdb) watch -l sharedData ``` #### 2. 内存泄漏调试(Valgrind) ```bash # 检测内存泄漏 valgrind --leak-check=full ./your_program # 检测无效内存访问 valgrind --tool=memcheck ./your_program ``` #### 3. 性能问题调试(CPU Profiling) ```python # Python 使用 cProfile import cProfile def slow_function(): # ... 性能问题代码 ... if __name__ == "__main__": cProfile.run('slow_function()', sort='cumulative') ``` ### 调试最佳实践 1. **最小化复现**:创建最小复现代码片段 2. **二分法定位**:在代码中间位置设置断点 3. **版本控制**:使用`git bisect`定位引入问题的提交 4. **快照调试**:使用录制功能(如rr、WinDbg Time Travel) 5. **远程调试**:调试容器或远程服务器中的代码 6. **可视化调试**:使用Python的`viztracer`或Chrome性能分析 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值