Tag: 调试

制作gdb显示汇编指令而不是C

可能重复: 切换到gdb中的程序集 我正在调试gdb中的一些代码。 当我运行ni (用于下一条指令 )命令时,它显示C代码。 显示执行的汇编指令对我来说更有意义。 (gdb) ni 0x0804845a 28 tmp = *lpp; (gdb) ni 0x0804845c 28 tmp = *lpp; (gdb) ni 0x0804846a 29 **lpp = (unsigned long) &buf; (gdb) ni 0x0804846c 29 **lpp = (unsigned long) &buf; 有没有办法让gdb显示汇编代码,而不是每次都调用disassm ? 编辑:我知道layout asm命令,它在readline窗口中显示代码。 我想在gdb命令行上看到反汇编,而不是在gdb窗口中。

调试在不同位置崩溃10次的程序

您将获得在运行时崩溃的应用程序的源代码。 在调试器中运行10次后,您发现它永远不会在同一个地方崩溃。 该应用程序是单线程的,仅使用C标准库。 哪些编程错误可能导致此崩溃? 你会如何测试每一个?

命令行应用程序:如何将子进程附加到xcode调试器?

我目前正在C中创建一个命令行应用程序,其中创建了许多子进程。 所以我需要调试这个子代码。 我在Xcode上创建了一个子进程,如下所示。 (参见断点和运行光标。) 执行一些语句后,我得到xcode将GBN(885)附加到xcode调试器,如下图所示。 它不起作用。 如何将子进程附加到xcode调试器? 先感谢您。

gdb | 查看变量参数列表

我使用bt命令查看堆栈跟踪。 输出是 (gdb) bt #0 0x001ae4cd in Debugger (message=0x1 “???\a”) at /SourceCache/xnu/xnu-1228.7.58/osfmk/i386/AT386/model_dep.c:705 #1 0x3bf97000 in ?? () #2 0x0012b0fa in panic (str=0x5ef “”) at /SourceCache/xnu/xnu-1228.7.58/osfmk/kern/debug.c:274 #3 0x001a8cd4 in kernel_trap (state=0x51a67c80) at /SourceCache/xnu/xnu-1228.7.58/osfmk/i386/trap.c:680 #4 0x0019ede5 in return_from_trap () at pmap.h:176 #5 0x00132bea in __doprnt (fmt=, argp=0x51a67e6c, putc=0x38ad24 , arg=0x51a67e48, radix=10) at /SourceCache/xnu/xnu-1228.7.58/osfmk/kern/printf.c:439 #6 0x0038ad11 in kvprintf […]

在访问冲突时创建转储文件

我想在发生无法处理的访问冲突时创建进程转储文件。 目前,我已经注册了我的,未处理的exception回调: SetUnhandledExceptionFilter(CustomUnhandledExceptionFilter); CustomUnhandledExceptionFilter创建转储文件并打印调用堆栈。 但是这种方法有一个缺陷 – 它是在AV已经发生时完成的,AVexception被抛出并且没有被它发生的线程处理。当exception即将离开线程范围并在此时创建转储时调用未处理的exception回调由于堆栈指针丢失,因此没有函数的局部变量发生exception。 有没有办法超过这个? 我想看看在AV发生的那一刻获得AV的线程堆栈。

如何在exception中使VC ++的调试器中断?

我正在尝试调试用C编写的DLL中的问题,该问题一直导致访问冲突。 我正在使用Visual C ++ 2008,但代码是直的C. 我已经习惯了Delphi,如果在调试器下运行时发生exception,程序将立即断开调试器,它将为您提供检查程序状态的机会。 但是,在Visual C ++中,我得到的只是Output选项卡中的一条消息: First-chance exception at blah blah blah: Access violation reading location 0x04410000. 没有rest,没有。 它只是进入并展开堆栈,直到它回到我的Delphi EXE中,它识别出错误并在那里提醒我,但到那时我已经失去了几层调用堆栈,我不知道发生了什么。 我已经尝试了其他的调试技术,但无论它在做什么,都是在C宏中的嵌套循环内深处进行的,这个循环被调用超过500次,这只是我的技能(或者我的耐心)来追踪。 我认为必须有一些方法来获得“第一次机会”的例外,实际上让我有机会处理它。 可能有一些“在第一次机会exception时立即中断”配置设置我不知道,但它似乎并不是所有可发现的。 有谁知道它在哪里以及如何启用它?

与EINVAL错误代码相关的机器相关_write失败

这在实际问题之前有一些冗长的背景,然而,它有一些解释,希望清除一些红色的鲱鱼。 我们的应用程序是在Microsoft Visual C ++(2005)中开发的,它使用第三方库(我们幸运的是它的源代码)来导出在另一个第三方应用程序中使用的压缩文件。 该库负责创建导出的文件,管理数据和压缩,以及通常处理所有错误。 最近,我们开始得到反馈,在某些机器上,我们的应用程序在写入文件时会崩溃。 基于一些初步探索,我们能够确定以下内容: 崩溃发生在各种硬件设置和操作系统上(尽管我们的客户仅限于XP / 2000) 崩溃总是发生在同一组数据上; 但是它们不会出现在所有数据集上 对于导致崩溃的一组数据,崩溃在所有机器上都不可重现,即使具有类似的特性,即操作系统,RAM的数量等。 该错误仅在应用程序在安装目录中运行时才会显现 – 不是从Visual Studio构建,在调试模式下运行,甚至在用户有权访问的其他目录中运行时 无论是在本地驱动器上还是在映射驱动器上构建文件,都会出现此问题 在调查问题后,我们发现问题出现在以下代码块中(稍作修改以删除一些宏): while (size>0) { do { nbytes = _write(file->fd, buf, size); } while (-1==nbytes && EINTR==errno); if (-1==nbytes) /* error */ throw(“file write failed”) assert(nbytes>0); assert((size_t)nbytes<=size); size -= (size_t)nbytes; addr += (haddr_t)nbytes; buf = (const char*)buf […]

打印n级callstack?

在Visual Studio中使用C ++,我想知道是否有一个API会为我打印callstack。 最好,我想打印5级深度的callstack。 Windows是否提供了一个简单的API来允许我这样做?

我可以给objdump一个地址并让它反汇编包含的函数吗?

我发现为了获得足够的上下文以查看导致崩溃的原因,必须反汇编大量的库代码真的很烦人。 有什么方法可以直接objdump一个地址,让它为我找到包含函数的边界? 编辑:更好的是,我可以让它拆卸整个堆栈跟踪吗?

如何在GCC中链接libc和libstdc ++的调试版本?

我知道这个问题 ,但它似乎对我不起作用。 对于设置,请使用一个简单的C ++程序hw.cpp ,由下式给出: int main() { } 在Linux上使用g++ -o hw hw.cpp -O0 -g进行编译时,运行ldd ./hw会给出: linux-gate.so.1 => (0x003e5000) libstdc++.so.6 => /usr/local/lib/libstdc++.so.6 (0x007c5000) libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x006a4000) libgcc_s.so.1 => /usr/local/lib/libgcc_s.so.1 (0x00a40000) libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00a93000) /lib/ld-linux.so.2 (0x00a0f000) 现在我似乎也在/usr/lib/debug/lib/tls/i686/cmov/有调试库,我想这是系统库的相应调试版本。 问题:如何编译我的程序,使其与标准C和/或C ++库的调试版本链接, libc / libm / libstdc++ ,共享或静态? 对于共享构建,我希望ldd ./hw的输出指向调试目录。 (背景:我的项目使用的其中一个共享库被Valgrind报告为泄漏(“仍然可以访问”),但起源不在共享库本身,而是在dlopen类型代码中( 参见此处 )。所以我我想如果我可以逐步完成CRT中的_Start()调用,我可以追查罪魁祸首。) 更新/更正:我认为我只是非常非常愚蠢 – 调试库可能始终按需要链接。 我对调试器在步进时没有显示任何内容感到困惑,这是因为我没有库的源代码 […]