本文介绍如何在 intellij idea 等 ide 中直接调试 find-sec-bugs 的自定义检测器,无需反复构建 jar 包,通过单元测试驱动和远程调试两种方式实现快速开发与问题定位。
本文介绍如何在 intellij idea 等 ide 中直接调试 find-sec-bugs 的自定义检测器,无需反复构建 jar 包,通过单元测试驱动和远程调试两种方式实现快速开发与问题定位。
在 find-sec-bugs 项目中开发新检测器(Detector)时,完全不必每次修改后都执行 mvn package 并手动替换 CLI 中的 plugins.jar——这种做法低效且易出错。推荐采用以下两种高效、可复现的调试方式:
find-sec-bugs 官方为每个检测器均提供了标准的 JUnit 测试用例(如 FileUploadFilenameDetectorTest),其核心逻辑是:
你只需:
示例测试片段(简化版):
@Testpublic void testYourDetector() throws Exception { String[] files = {"path/to/YourVulnerableClass.class"}; BugReporter reporter = new SelfCheckingBugReporter(); // 自动加载当前模块中所有 Detector(含你刚写的) SpotBugsFramework.runAnalysis(files, reporter, new Class<?>[]{YourCustomDetector.class}); assertEquals(1, reporter.getBugCount()); // 断言触发一条告警}
⚠️ 注意事项:确保 Maven 依赖已正确导入(尤其是 spotbugs, findsecbugs-plugin),且测试运行时使用 "Use classpath of module: findsecbugs-plugin"(IDEA 中右键测试 → Run Configurations → Use classpath of module)。
当需验证 Detector 在完整 CLI 流程中的行为(如多 JAR 分析、参数传递、报告生成等),可启用 JVM 远程调试:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=127.0.0.1:8000
✅ 优势:真实环境复现、支持复杂输入;
⚠️ 注意:suspend=n 表示启动不挂起,若需在 main 入口前断点,请改用 suspend=y 并等待 IDE 连接后再继续。
| 场景 | 推荐方式 | 关键优势 |
|---|---|---|
| 快速验证 Detector 逻辑、opcode 解析、bug 报告条件 | 单元测试本地调试 | 启动快、断点精准、可自动化回归 |
| 验证 CLI 集成、跨类分析、报告输出等端到端行为 | CLI 远程调试 | 环境真实、覆盖完整执行链路 |
无论哪种方式,均无需重新打包整个项目——只要你的 Detector 类被 IDE 正确编译并纳入测试/运行类路径,即可实时调试。这是 find-sec-bugs 社区推荐的标准开发实践,大幅降低 Java 静态分析插件的入门门槛。