问题标签 [postmortem-debugging]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
windbg - 从 Microsoft Dev Dashboard 的崩溃中获取符号
Microsoft Windows 开发中心仪表板让我可以收集来自本地桌面应用程序故障的堆栈跟踪。
不幸的是,小型转储不可用。我只是得到一个 TSV 文件,其中(有时)有一个堆栈跟踪,它看起来像这样:
为了使这变得有用,我在 WinDbg 中加载匹配的二进制文件,计算出偏移量加上基地址,然后在结果地址处反汇编。如果我的应用程序在 0x00400000 加载,我添加 0x2F59A1 并得到 0x006F59A1。在那里反汇编显示了该堆栈帧的返回地址,因此我可以了解崩溃的原因。
有没有更好的办法?如何从开发中心请求小型转储?(微软支持说我不能。真的吗?)是否有脚本可以在 TSV 文件中转换可用的堆栈跟踪,这样我就不会手动评估每个堆栈帧?还有其他方法吗?
gdb - 如果我只有一个共享库,如何在核心转储中获取符号?
我们提供了一个共享库,供客户用于集成到他们的产品中。
我们从客户那里得到了一个核心转储,通过查看info proc mappings
我可以看到加载的模块,并且thread apply all bt
我可以看到堆栈跟踪中有条目位于我们的库加载范围内。因此,我们的 lib 可能导致崩溃。但我们无权访问客户使用的可执行文件。
如果我们只有我们提供的共享库而不是主可执行文件,有没有办法在这个核心转储中获取符号?
我尝试使用 file 命令加载内核和库,反之亦然,但堆栈跟踪不显示任何符号。
互联网上的大多数示例似乎暗示您可以访问可执行文件本身以获得有意义的符号。如果我将共享库加载到 GDB 中,我可以获取它的符号吗?
其他细节:生产系统使用的 GCC 与我 PC 上安装的不同(旧得多)。我们有可用的库的未剥离版本,我们提供剥离的库。
debugging - 在 Windows 10 上启用事后调试
对于较旧的 Windows 版本,当应用程序中发生未处理的异常时,用户可以选择运行事后调试器并可能解决异常。甚至可以将事后调试器设置为自动启动(例如:https ://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/enabling-postmortem-debugging )。但是,似乎此功能已在 Windows 10 中完全删除或至少禁用 - 失败的应用程序将静默终止,并且唯一的错误痕迹是写入事件日志的记录。有什么办法可以恢复旧的行为?这是我的应用程序需要做的事情(例如,将自己注册为事后调试器的可能目标)还是与系统相关的事情?
c++ - Windows Embedded Compact (Windows CE) 程序的事后分析
我们有一个非托管 C++ 应用程序(MFC 框架,Windows CE),它在看似随机的时刻关闭我们。
没有错误消息,也没有 C++ 异常,它就消失了。
我认为一定发生了一些不好的事情,并且 C 运行时或操作系统决定终止该程序。但我不确定在哪里继续搜索。
问题:是否有可能在 Windows CE 的某个地方看到为什么应用程序首先终止?
Windows CE 是否收集基本的崩溃信息?也许至少可以看到它是访问冲突、内存不足情况、内核/驱动程序恐慌还是其他类型的内部或外部事件迫使应用程序关闭?
在一台普通的 x86 PC 上,调试器、应用程序验证器、Windows 错误报告工具、WinDbg 等会崩溃。但是如何(开始)分析 Windows CE 应用程序崩溃?
到目前为止我已经尝试过:
- 在应用程序的战术位置创建全局 C++ 异常处理程序。这些构建和传输包含最少异常信息的简单 UDP 数据包。然后在另一台运行 Wireshark 的机器上查看这些内容。
- 添加 SEH 异常编译器开关 (
/EHa
),以便能够捕获甚至那些非 C++ 异常,例如访问冲突等。 - 通过 TCP/IP 将 Visual Studio 2008 调试器与智能设备连接(MSVS 表示成功连接到智能设备,但调试器没有看到任何远程进程
Attach to process
。VS 窗口给出以下错误:Unable to Connect to ''
.) - 重新定位应用程序,使其在常规 x86 PC 上运行(但随后运行良好,因此也没有“奢侈”的调试问题)
我通过强制访问冲突测试了异常处理程序。预期的 UDP 消息完美地到达运行 Wireshark 的机器。但是当真正的问题发生时,它完全保持沉默。
平台:在德州仪器处理器 (ARM A8) 上运行的 MS Windows Embedded Compact 7.02。
应用程序本身实现了一个基本的 VNC 查看器。它使用套接字并依赖名为 zlib CE ( ) 的第三方二进制文件ZLIBCE.DLL
来解压缩 VNC 数据。
尚未验证 zlib 二进制文件是否已针对完全相同的编译器(和/或编译器设置)构建。
linux - 如何加载单独的调试文件,例如 abc.debug 文件而不是二进制文件以在 GDB 中进行调试?
“gdb 程序核心.11230”
是将core加载到gdb的实际格式。但我没有“程序”二进制文件。相反,我有单独的调试文件和核心。所以我正在加载 .debug 文件而不是二进制文件
“gdb coredump.debug coredump_core.dump”
在 GDB 中调试时,它不会显示确切的行号和源代码文件。使用二进制和核心进行正常调试并非如此。
我也没有源文件。我只能访问核心转储和单独的调试文件。
我究竟做错了什么。请高手给点建议?
memory-management - 为所有 pod 全局分配每个 pod 的 UUID/唯一 ID
是否有自动分配给所有 K8S pod 或者可以为集群全局配置的 UUID 属性(或类似属性)?
我有一个应用程序在我的集群中充当数据库 (DB) 前端,其中一些(但不是所有的 pod)提交了一个数字“资产”目录,它们可以让集群访问。pod 应该在关闭之前“清理”它们在数据库中创建的条目,但在某些情况下,pod 可能会崩溃,从而阻止关闭/清理代码执行。
即使我使用了 pre-stop hook,pod 已经崩溃了,我无法再访问其中的数据以了解它向 DB 应用程序报告了哪些资产。
我正在考虑让 DB 应用程序在收到传入连接后向远程 pod 查询 IP、某种唯一 ID/UUID 等;并将该数据映射到 pod 提交的数据库信息。然后,我可以让 DB 应用程序通过 K8S REST API 定期轮询集群,以查看具有相应 UUID 的 pod 是否仍然存在,如果与它们关联的 pod-UUID 不再存在,则清除各个记录。
问题):
- 有没有办法在全局级别自动将这样的 UUID 分配给集群中的所有 pod(即,无需修改我所有的 pod、部署等的 YAML 文件)。
- 是否有其他 K8S 提供的机制/功能可以提供更好的方法来对位于单独/外部 pod 中的 pod 资源进行事后清理?
python - 如何在 Django 的运行服务器中进行事后调试?
我目前正在调试一个导致异常的 Django 项目。我想进入ipdb
事后调试器。我试过ipdb
作为脚本调用(参见https://docs.python.org/3/library/pdb.html),但这只是让我进入第一行代码:
如果我按c
to continue
,我只会遇到错误,不可能在事后检查调试器。大概我可以按n
( next
) 直到我得到错误,但这会很麻烦。
有没有办法通过python manage.py runserver
事后调试运行?
crash - .Net 进程的自动故障转储
我正在尝试设置一个 Windows Server 2016 实例,以便在 .Net 进程以未处理的异常退出时自动创建故障转储。我尝试了以下方法:
Windows 错误报告(如此处所述:https : //docs.microsoft.com/en-us/windows/win32/wer/wer-settings)[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\MyApplication.exe ] "DumpType"=dword:00000002 "DumpCount"=dword:00000005 "DumpFolder"="C:\dumps"
WinDbg 作为事后调试器(windbg -I,如下所述:https ://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/enabling-postmortem-debugging )
procdump 作为事后调试器(procdump -ma -i C:\dumps,如上述链接中所述。)
我尝试以会产生异常的方式运行我的应用程序。我所要做的就是在相同的配置中启动它两次,然后第二个实例在套接字绑定异常上崩溃。但是,在上述任何情况下,崩溃都不会生成转储文件。我在 Windows Server 2016 上是否需要做一些特别的事情,或者我需要对我的 .Net 应用程序做一些特别的事情以使其触发未处理异常的转储?
c++ - 在 VS2017 中搜索内存
我在 Visual Studio 2017 中打开了我的 C++ 应用程序的 minidump 文件。该转储是一个因访问冲突而崩溃的程序。我怀疑堆/堆栈损坏,所以我在内存/反汇编窗口中花费了大量时间,试图解释堆栈。
如果我可以在内存中搜索某个值(例如函数调用的返回地址),那将非常方便。我知道 WinDbg 可以做到,但它目前没有正确设置符号路径,我宁愿留在一个调试器中。
我发现这个链接说 Visual Studio 2010 支持.S -D 0x20B4EC L100 0x12EC9275
在即时窗口中输入类似的内容,但是当我在 VS2017 中尝试时,我只是得到expected an expression
.
我错过了什么吗?
(注意,虽然我现在正在分析故障转储,但在调试实时程序时它似乎也不起作用)
澄清
- 我有一个包含内存的小型转储
- 常规分析工作正常:我有 pdb 文件,我可以看到线程、堆栈、手表,随你怎么说。只是我怀疑堆栈损坏,所以这些没有多大意义。(要么,要么优化器在惹我)
- 因此,我打开了内存窗口(单击 Debug->Windows->Memory->Memory 1)。在那里,我可以看到(原始)内存。现在,我想在该内存中搜索特定值。