debugging - 如何在没有调试器的情况下调试程序?

标签 debugging

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center寻求指导。




9年前关闭。




面试题——

通常,一旦您的代码出现问题,调试程序会变得非常容易。您可以放置​​ watch 、断点等。由于调试器,生活变得更加轻松。

But how to debug a program without a debugger?

One possible approach which I know is simply putting print statements in your code wherever you want to check for the problems.



除了这个还有其他方法吗?

作为一个一般性问题,它不限于任何特定语言。所以请分享您对如何做到这一点的想法?

EDIT- While submitting your answer, please mention a useful resource (if you have any) about any concept. e.g. Logging
This will be lot helpful for those who don't know about it at all.(This includes me, in some cases :)

UPDATE: Michal Sznajderhas put a real "best" answer and also made it a community wiki.Really deserves lots of up votes.

最佳答案

其实你有很多可能性。重新编译源代码或不重新编译。

随着重新编译。

  • 附加 logging .进入程序日志或使用系统日志(例如,OutputDebugString 或 Windows 上的事件日志)。还可以使用以下步骤:
  • 始终包括时间戳,至少达到秒分辨率。
  • 如果是多线程应用程序,请考虑添加线程 ID。
  • 添加一些不错的结构输出
  • 不要仅使用 %d 打印出枚举。使用一些 ToString()或创建一些 EnumToString()功能(适合您的语言)
  • ...请注意:记录 变化时间安排,因此在大量多线程的情况下,您的问题可能会消失。
  • 更多详情 here .
  • 引入更多断言
  • 单元测试
  • “视听”监控:如果发生某些事情,请执行以下操作之一
  • 使用蜂鸣器
  • 播放系统声音
  • 通过启用硬件 GPIO 线使一些 LED 闪烁(仅在嵌入式场景中)

  • 无需重新编译
  • 如果您的应用程序使用任何类型的网络:Packet Sniffer或者我会为你选择:Wireshark
  • 如果您使用数据库:监控发送到数据库和数据库本身的查询。
  • 使用虚拟机测试与您的系统运行时完全相同的操作系统/硬件设置。
  • 使用某种系统调用监视器。这包括
  • 在 Unix 机器上 stracedtrace
  • 在前 Sysinternals 的 Windows 工具上http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx 等工具, ProcessExplorer和类似的
  • 如果是 Windows GUI 的东西:查看 Spy++或 WPF Snoop (虽然第二个我没用)
  • 考虑为您的平台使用一些分析工具。它将为您概述应用程序中发生的事情。
  • [真铁杆] 硬件监控:使用示波器(又名 O-Scope)监控硬件线路上的信号
  • 源代码调试:您坐下来处理源代码,然后用纸和铅笔假装您是计算机。它所谓的代码分析或“我的眼睛”调试
  • 源代码控制调试。比较“它”工作时和现在的代码差异。错误可能在某处。

  • 最后还有一些一般提示:
  • 不要忘记 Excel 中的文本到列和数据透视表。与一些文本工具(awkgrepperl)一起为您提供令人难以置信的分析包。如果您有超过 32K 的记录,请考虑使用 Access 作为数据源。
  • Data Warehousing 的基础知识可能有帮助。使用简单的多维数据集,您可以在几分钟内分析大量的时间数据。
  • 转储您的应用程序值得一提。由于崩溃或只是定期
  • 总是 为您生成调试符号(即使是 release builds )。
  • 几乎最后但并非最不重要:大多数市长平台总是内置某种命令行调试器(甚至是 Windows!)。使用条件调试和 break-print-continue 之类的技巧,您可以获得非常好的结果,但有一些模糊的错误
  • 最后但同样重要的是:用你的大脑和质疑一切 .

  • 一般来说,调试就像科学:你不是创造它,而是发现它。很多时候,这就像在刑事案件中寻找凶手。所以自己买a hat永不放弃。

    关于debugging - 如何在没有调试器的情况下调试程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1592457/

    相关文章:

    android - 无法在 ubuntu 13.04 中显示 android 设备

    c - 这在 gdb 中意味着什么?

    dom - 卡住 Dom 操作

    javascript - jQuery ".on( ' click' ,....)"不适用于 LET 变量声明。但适用于 VAR

    debugging - websphere 7 调试端口 : 0. 0.0.0

    windows - 在 windbg 中进行内核调试时无法获得完整的用户模式堆栈跟踪

    java - 如何调用 switch 语句返回类型

    php - 500内部服务器错误,如何调试

    php - Laravel - 更好的错误跟踪

    c++ - Qt/C++ 中的反射