软件开发新手入门五大核心技能之逻辑思维与问题排查(三)

简介: 教程来源 http://bgnno.cn/ 本书第五至九章系统讲解高效调试技术:涵盖结构化日志、请求ID追踪、智能进度打印;断言与防御式编程实践;IDE高级调试(条件/日志/异常断点、逆向调试);Valgrind、perf、Wireshark等专业工具;以及远程诊断、Arthas、core dump等生产环境排查方案。

第五章 打印日志的艺术

打印是最简单但最强大的调试手段,但要打印得有智慧。

5.1 结构化日志
不要只打印字符串,使用结构化格式(JSON)方便后续分析。

import json
import time

def log(level, message, **kwargs):
    record = {
        "timestamp": time.time(),
        "level": level,
        "message": message,
        **kwargs
    }
    print(json.dumps(record))

log("INFO", "User login", user_id=123, ip="192.168.1.1")

5.2 带上下文的调试 ID
在多线程或 Web 环境中,为每个请求生成唯一 ID,贯穿所有日志。

import contextvars
import uuid

request_id = contextvars.ContextVar('request_id')

def set_request_id():
    rid = str(uuid.uuid4())
    request_id.set(rid)
    return rid

def debug(msg):
    rid = request_id.get(None)
    print(f"[{rid}] {msg}")

5.3 在循环中使用进度打印
避免打印每次迭代,而是每隔 N 次打印一次。

for i, item in enumerate(large_list):
    if i % 1000 == 0:
        print(f"Processed {i} items")
    process(item)

第六章 断言与防御式编程

断言用于捕捉“不应该发生”的情况。

断言的最佳实践:

在函数入口检查参数合法性(防御性编程)。

在复杂算法的不变量处断言。

不要断言可能因外部输入而失败的条件(如文件是否存在),那是业务逻辑。

def complex_calculation(data):
    assert len(data) > 0, "data cannot be empty"
    # ...
    # 循环后断言结果范围
    assert 0 <= result <= 100, f"Result out of range: {result}"
    return result

在生产环境,可以使用 -O 标志禁用断言,但建议在关键服务中保留(通过配置开关)。

第七章 IDE 高级调试技巧

7.1 条件断点
当循环次数很大时,只希望在特定条件下暂停。

Eclipse/IntelliJ: 右键断点 → 输入条件,如 i == 500 && list.get(i).equals("error")。

VS Code: 在断点处右键 → 编辑断点 → 表达式。

7.2 日志断点(不会停止程序的断点)
IntelliJ: 右键断点 → 取消 "Suspend",勾选 "Log evaluated expression"。

VS Code: 创建断点后,选择 "Log Message"。

7.3 字段/变量断点
在 Java/C# 中,可以对字段设置断点,当字段值被修改时暂停(即使不是直接赋值,而是通过反射)。

7.4 异常断点
在 IDE 中设置异常断点,任何抛出该类型异常的地方都会暂停(包括 catch 块之前)。这对排查被吞掉的异常极其有用。

7.5 逆向调试(Reverse Debugging)
某些高级调试器(如 GDB 7.0+、RR、UndoDB)支持反向执行,可以回到之前的某个指令重新观察。

RR (Mozilla) 示例: 录制程序运行,然后可以前后自由移动。

rr record ./my_program
rr replay

第八章 专业工具专题

8.1 内存调试三剑客
Valgrind (Linux): valgrind --leak-check=full ./my_program

AddressSanitizer (Clang/GCC): 编译时加 -fsanitize=address -g

Dr. Memory (Windows)

8.2 性能 Profiler
perf (Linux 内核级): perf record -g ./my_program → perf report

py-spy (Python, 无需改代码): py-spy record -o profile.svg --pid 1234

JProfiler (Java, 商业)

Chrome DevTools (前端)

8.3 网络调试
Wireshark + tshark: 抓包分析 HTTP、TCP 细节。

mitmproxy: 命令行中间人代理,可查看和修改请求。

Charles Proxy (GUI, 跨平台)

8.4 系统调用追踪
strace (Linux): strace -f -e trace=file,network ./my_program 追踪文件操作和网络调用。

dtruss (macOS)

Process Monitor (Windows)

第九章 远程调试与生产环境问题排查

生产环境通常无法安装开发工具或插入断点。可行方法:

增强日志:动态调整日志级别(如通过 admin 接口将某个类的日志级别改为 DEBUG)。

JMX(Java):使用 JConsole 连接到运行中的 JVM 查看线程、内存。

Arthas(阿里开源 Java 诊断工具):可在线查看方法调用参数、返回值、异常,甚至修改字节码。

btrace(动态跟踪 Java 程序)。

Python 的 py-spy 可以安全地附加到生产进程,不产生性能影响。

核心转储(core dump):程序崩溃后,保留内存快照,离线分析。

ulimit -c unlimited          # 允许生成 core dump
./my_program                 # 崩溃后生成 core
gdb ./my_program core        # 离线分析

来源:
http://detxg.cn/

目录
相关文章
|
1月前
|
开发工具 git
软件开发新手入门五大核心技能之版本控制工具(三)
教程来源 http://wkmsa.cn/ Git分支是其“杀手级特性”,本质为轻量可移动指针,指向提交对象。支持快速创建、切换、合并与变基,实现并行开发、风险隔离与高效协作。含快进/三方合并、冲突解决及交互式历史重写等核心能力。
165 0
|
1月前
|
缓存 搜索推荐 网络协议
软件开发新手入门五大核心技能之逻辑思维与问题排查(一)
教程来源 http://qeext.cn/ 程序员的核心生产力不是写代码,而是解决问题。本书揭示:80%工作时间用于理解代码、排查Bug。以逻辑三要素(概念、命题、推理)为根基,结合真值表、德摩根定律、逆向思维与MECE原则,系统训练问题分析与定位能力,助你告别“面向搜索引擎编程”。
175 0
|
1月前
|
存储 开发工具 数据库
软件开发新手入门五大核心技能之版本控制工具(四)
教程来源 http://ltglu.cn/ 本章详解 Git 远程协作与标签管理:涵盖远程仓库配置、克隆、推送/拉取、fetch、分支跟踪及冲突解决;并介绍轻量与附注标签的创建、查看、推送与删除,助力团队高效协同与版本精准标记。
157 0
|
1月前
|
JSON Java 测试技术
软件开发新手入门五大核心技能之逻辑思维与问题排查(二)
教程来源 http://qfcrz.cn/ 本书第三、四章系统阐述问题排查方法论:提出“镇定复现→定位→隔离→假设→验证→修复→复盘”六阶段模型,并分类详解语法、运行时、逻辑、并发等10类错误的根因与实战对策,辅以代码示例和工具链,助力高效精准排障。
227 0
|
1月前
|
JavaScript 安全 Java
软件开发进阶技能之编程语言深度运用(一)
教程来源 http://xbivx.cn/ 本文聚焦编程进阶核心——从“会用”到“用好”的跃迁。通过深度解析类型系统(泛型、类型推断、ADT/模式匹配)、内存、并发、函数式等共性机制,结合Java/Python/TS/Go实战示例,助开发者写出更安全、高效、优雅的代码。
132 0
|
1月前
|
JSON 人工智能 前端开发
软件开发新手入门五大核心技能之学习与文档阅读能力(一)
教程来源 http://aescc.cn/ 本文聚焦软件开发新手的两大核心能力:持续学习力与高效文档阅读力。指出它们才是突破技术门槛、实现自主成长的第一关键,远胜于单纯写代码。内容涵盖搜索技巧、提问方法、AI辅助策略及分层读文档法(如MDN/Express实战),助你建立扎实自学体系。
163 0
|
1月前
|
存储 人工智能 自然语言处理
知识库为谁而建 ?
随着 Agent 的逐步广泛应用,知识库的使用者正在从人变成 Agent。 知识库的设计逻辑、维护方式、甚至存在的意义,都需要重新思考。
535 10
知识库为谁而建 ?
|
1月前
|
测试技术 C++ Python
如何从零开发一个工业级的 SKILL
手把手教你搓个 Skill,亲测新手也能跑起来,实操党可以直接冲~
334 1
如何从零开发一个工业级的 SKILL
|
1月前
|
人工智能 运维 供应链
2026年5月30日AI简报 | OpenAI生物防御 | Anthropic融资 | 天津智博会 | 戴尔AI服务器 | GitHub Copilot自主化
2026年5月30日,AI领域呈现五大趋势:OpenAI推“受信任访问”式Rosalind生物防御项目;Anthropic融资650亿美元、估值首超OpenAI;天津智博会展现大模型千行百业落地;戴尔AI服务器收入暴增757%;GitHub Copilot升级为自主编程Agent。AI正迈向治理化、产业化、硬件化与智能化新阶段。
329 1
|
1月前
|
存储 算法 C++
C++在高性能内存池(MemoryPool)设计与实现
频繁调用new/delete或malloc/free会造成性能损耗(系统调用、锁竞争、内存碎片)。
172 3