分离Gdb而不恢复劣质

2024-04-22

Gdb 与任何其他程序一样,并不完美,我时不时会遇到导致当前 Gdb 实例无法使用的错误。此时,如果我有一个调试会话,其中有很多有价值的状态,我希望能够在其上启动一个新的 Gdb 会话。也就是说,分离、退出 Gdb 并启动一个新的 Gdb 实例以从我中断的地方重新启动。

然而,当分离 Gdb 时,它会恢复下级,以便它继续在原来的位置运行,这破坏了整个练习的意义。因此,我想知道是否可以在劣质的状态下分离,就好像它被发送了一样SIGSTOP, 基本上。

我尝试简单地杀死 Gdb,但有趣的是,这似乎也带走了劣等的东西。不知道这是如何运作的。


当分离 Gdb 时,它恢复下级

GDB 不会,内核会(假设是 Linux)。

我试过简单地杀死 Gdb,但有趣的是,这似乎也带走了劣等的东西

内核发送它SIGHUP,通常会杀死劣等人。您可以通过以下任一方法来防止这种情况发生SIG_IGN在劣势,或者简单地说(gdb) call signal(1, 1).

之后,您可以分离并退出 GDB,但内核将恢复以下状态:SIGCONT(请参阅下面的更新),所以您回到了第一个地方。

然而,有is一个办法。考虑以下程序:

int main()
{
  while (1) {
    printf("."); fflush(0); sleep(1);
  }
}

gdb -q ./a.out
(gdb) run
Starting program: /tmp/a.out 
.....^C
Program received signal SIGINT, Interrupt.
0x00007ffff7ad5de0 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:81
81  ../sysdeps/unix/syscall-template.S: No such file or directory.

我们希望该程序能够not分离时逃跑,所以我们发送它SIGSTOP:

(gdb) signal SIGSTOP
Continuing with signal SIGSTOP.

Program received signal SIGSTOP, Stopped (signal).
0x00007ffff7ad5de0 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:81
81  in ../sysdeps/unix/syscall-template.S
(gdb) detach
Detaching from program: /tmp/a.out, process 25382

请注意,此时,gdb 已分离(但仍处于活动状态),并且程序正在运行not运行(停止)。

现在在不同的终端中:

gdb -q -ex 'set prompt (gdb2) ' -p 25382
0x00007ffff7ad5de0 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:81
81  ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb2) c
Continuing.

Program received signal SIGSTOP, Stopped (signal).
0x00007ffff7ad5de0 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:81
81  in ../sysdeps/unix/syscall-template.S
(gdb2) sig 0
Continuing with no signal.

程序继续运行,在第一个终端中打印点。

Update:

SIGHUP- 有趣的。但是通过什么机制呢?

好问题。我不知道,但这似乎就是答案:

From setpgid man page http://man7.org/linux/man-pages/man2/setpgid.2.html:

If the exit of the process causes a process group to become orphaned,
and if any member of the newly orphaned process group is stopped,
then a SIGHUP signal followed by a SIGCONT signal will be sent to
each process in the newly orphaned process group.

我已经验证,如果我分离并退出 GDB 而不停止劣等,它不会得到SIGHUP并继续奔跑而不死。

如果我发送的话SIGSTOP并安排SIGHUP被忽略,然后我看到两者SIGHUP and SIGCONT被送入strace,因此与手册页完全匹配:

(gdb) detach
Detaching from program: /tmp/a.out, process 41699

在另一个窗口中:strace -p 41699。回到GDB:

(gdb) quit

跟踪输出:

--- stopped by SIGSTOP ---
--- SIGHUP {si_signo=SIGHUP, si_code=SI_KERNEL} ---
--- SIGCONT {si_signo=SIGCONT, si_code=SI_KERNEL} ---
restart_syscall(<... resuming interrupted call ...>) = 0
write(1, ".", 1.)                        = 1
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分离Gdb而不恢复劣质 的相关文章

  • 如何在 gdb 中禁用“键入 继续,或 q 退出”?

    我想要自动化gdb 并且等待用户输入是不可取的 如何禁用消息 Type
  • 如何在 Chrome/Safari 中调试 EJS 代码

    我正在将 EJS 模板与 CanJS 一起使用 并正在寻找一种调试我的 EJS 代码的方法 目前 firebug 可以向我显示 EJS 中的语法错误 但在其他浏览器中 我看不到任何内容 我需要非常仔细地检查我的 EJS 文件来解决错误 我在
  • Objective-C 有没有办法捕获发送到 nil 的消息?

    我刚刚被一种烦人的东西咬了bug https stackoverflow com questions 913627 uiviewcontroller viewdidload not being calledObjective C 中的 向
  • 开始调试和附加到进程有什么区别

    当我将项目附加到我的 w3wp exe IIS 工作进程时 我的项目加载速度明显快于 开始调试 时的加载速度 但是 无论我 开始调试 还是 附加到进程 同一个工作进程似乎都在处理相同数量的模块 DLL w3wp exe 为什么附加到进程的速
  • gdb 通过指向错误的代码行显示不正确的回溯

    我们可以通过在源代码中包含多个中止调用 用非常简单的示例重现此问题 在下面的示例代码中 我们在不同条件下总共有四个中止调用 但是当我们使用优化标志 O3 进行编译时 我们只能看到一个中止调用的调试信息 因此 在这四个中止调用中发生崩溃时 g
  • 使用 libtool 和 gdb

    我正在开发一个使用 GNU 自动工具的项目 因此为了使用 gdb 调试代码 我从 libtool 中运行 gdb libtool mode execute gdbtui foobar 是否可以重新加载项目的修改版本 而不必退出 gdb li
  • GDB/bin/bash 无法在 Eclipse CDT 中执行应用程序?

    在 Mac OS X Mojave 上使用 Eclipse CDT 运行 GDB 时遇到困难 当我尝试调试项目时 GDB 表现得很混乱 我能够调试几次 但随后它在下一个调试会话开始时开始停止 并显示消息 配置 GDB 可执行文件是 User
  • 如何在 Rust 中使用 cfg 检查发布/调试版本?

    使用 C 预处理器很常见 if defined NDEBUG release build endif if defined DEBUG debug build endif Cargo 的大致等价物是 cargo build release以
  • 如何使用 PDB 文件

    我听说使用 PDB 文件可以帮助诊断崩溃发生的位置 My basic理解是你给 Visual Studio 源文件 pdb 文件和崩溃信息 来自 Dr Watson 有人可以解释一下这一切是如何运作的 涉及什么吗 谢谢你 PDB 文件将程序
  • wpf 调试错误输出 System.WIndows.Data 错误 25

    我有一个自定义样式的组合框 效果很好 它被放置在用户控件内并绑定到数据结构 我使用 DisplayMemberPath 仅显示组合框文本框中的一个元素 ComboBox 样式取自 MSDN 并被多次使用 所以这里就不显示了
  • GDB错误:“进程记录:当前架构不支持记录功能”

    我正在尝试在 GDB 中进行反向执行 特别是target record按照说明在 gdb 中运行我的程序后here https stackoverflow com questions 1206872 go to previous line
  • 如何设置 Eclipse 以停止发生异常的线路?

    如何设置 Eclipse 在发生异常时停止 我有一个 Eclipse 断点设置来在异常时中断 在下面的代码示例中 我遇到的问题是 Eclipse 尝试打开 Integer 源代码 有没有办法让调试器在我的代码示例中显示的位置中断 如果我向下
  • php:不知从何而来的空行

    我有奇怪的错误 不知道如何解决它而不浪费太多时间 我的控制器中有一个方法 应该使用以下方法返回 xml header Content type text xml header Content Disposition attachment f
  • 调试 Android 库中的本机代码

    我的工作空间布局是 ApplicationLibrary AndroidManifest xml jni libs src Application AndroidManifest xml ant properties 如何在 Eclipse
  • 代码::块 - 警告:GDB:无法设置控制终端:不允许操作

    我已经通过官方存储库在 Ubuntu 14 04 中安装了 Code Blocks 13 12 当我编译时 一切正常 但是当我调试时 shell 中会显示以下消息 警告 GDB 无法设置控制终端 操作不正确 允许的 程序执行到断点 但当我执
  • valgrind 和 iOS SDK 4.2?

    使用 valgrind 运行 iOS 4 2 应用程序时遇到问题 我从 Macports 安装了 valgrind 3 6 0 SVN Xcode 3 2 5 当我修改 main 以运行 valgrind 时 我得到以下输出 Detecte
  • 如何远程调试长时间运行的 python 脚本或服务?

    正如标题所说 我希望能够连接到在 Paster 或 uwsgi 下运行的 python 进程并利用 pdb 功能 Using winpdb http winpdb org 您可以像这样附加到正在运行的进程 插入 import rpdb2 r
  • 当前本地调试 Travis 构建的工作流程是什么?

    One 曾经能够 https stackoverflow com questions 16677232 where can i download the 64 bit travis ci vm images to 下载流浪盒 http re
  • NSNumber numberWithInt 在数字 >= 13 上崩溃

    我对 Objective C 还很陌生 我已读完类似的问题 https stackoverflow com questions 2533355 nsnumber 13 wont retain everything else will但我不知
  • 使用 IntelliJ / Android Studio 调试基于 gradle 的单元测试

    我正在使用robolectric gradle 插件 https github com robolectric robolectric gradle plugin为 Android 编写单元测试 到目前为止 除了能够使用 Android S

随机推荐

  • 如何动态地为类方法定义别名方法?

    我有一个名为 计算器 的模块 我想将其包含在 产品 类中 计算器将扩展 Product 它将类方法复制到 Product 上 这些类方法之一是 memoize 我的想法是我可以做这样的事情 module Calculator def sel
  • 在 Python 中用交替颜色填充轮廓

    我正在尝试获得一种用交替颜色填充图像轮廓的算法 首先是白色 然后是黑色 然后再次白色 然后再次黑色 就像下图所示 到目前为止 我所取得的成就是用白色填充图像的轮廓 然后用黑色保留图像内部的轮廓 代码如下 import numpy as np
  • 如何匹配空手道中嵌套 json 对象中的动态键?

    尝试匹配空手道框架中 API 响应中的嵌套 json 对象 以下是我的 API 响应 status code 0 message Successful data PHX name Phoenix All city code PHX coun
  • 什么时候函数名太长?

    在可能的情况下 我尝试对我的函数名称进行描述 这有时会导致函数名称在二十到三十个字符范围内 例如GetActionFromTypeName or GetSelectedActionType 在什么时候函数会变得太长而难以管理 对于编译器来说
  • django - 登录视图没有反向匹配

    我只是尝试 d jango 并按照文档进行身份验证 基本上我想看一下用户登录表单页面 但我得到 Caught NoReverseMatch while rendering Reverse for django contrib auth vi
  • 如何在 Rails 3 中使用 Draper 修饰嵌套属性(关联)?

    我的环境 Rails 3 2 with draper https github com jcasimir draper gem 我正在使用嵌套资源 并且无法确定在哪里声明装饰器 app controllers users controlle
  • Chart.js如何获得组合条形图和折线图?

    我想问一下使用 Chart js 是否可以http www chartjs org http www chartjs org 获得组合条形图和折线图 感谢您的任何建议 下面的答案与 Chart js 1 x 有关 Chart js 2 x
  • Facebook 如何在不重新加载页面的情况下更改 url? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在不重新加载和 hack 的情况下更改 Windows 位置 https stackoverflow com questions 3997181 how could i change window
  • 如何从用户列表中查找PC

    我需要一些帮助 我不太确定这是否可能 我有清单samAccountName in csv文件 我需要从中获取他们的 PC 名称和 IP 我不太确定如何构建这样的脚本 一种方法是循环访问环境中的所有计算机并测试每台计算机 这当然会是SLOW
  • 泛型显式转换

    我实现了从字符串到名为 Foo 的对象的显式转换 所以 gt Foo f Foo foo 数据 作品 我需要实现一个将字符串转换为通用 T 的函数 在本例中 T 是 Foo 数据类型 public T Get
  • 宏的问题

    HI 有人可以帮助我理解为什么 SQUARE x 的值为 49 吗 我正在使用 Visual C 6 0 define SQUARE X X X int main int argc char argv int y 5 printf d n
  • 如何在 SwiftUI 中为按下时的导航链接设置动画?

    我试图通过在按下 NavigationLink 时提供一些反馈来改进用户体验 我的意思是一个简单的动画 它会增长然后缩小链接以显示它被按下或以任何其他方式提供反馈 这是我正在尝试改进的代码 NavigationLink destinatio
  • 在 C++ 中与 VARIANT 类型相互转换的简单方法

    有没有便于使用 高级类或库让您可以与VARIANT在 Visual C 中 更具体地说 我想在 POD 类型之间进行转换 例如double long 字符串 例如CString 和容器 例如std vector and VARIANTs 例
  • 如何使argparse在可执行程序中工作

    我有一个使用 argparse 模块的命令行脚本 import argparse def run print Running def export print Exporting def argument parser parser arg
  • 连接两个整数并将结果作为 SQL 中的字符串

    在表中 2 个字段 ID 为 int Number 为小 int 我想连接这两个字段并显示为字符串 eg ID 101 and Number 9 output 101 9 ID 和 Number 之间要加点吗 如何用SQL进行查询 You
  • 按日期订购 asp.net MVC 5

    我有一个创建新闻条目并显示 10 条新闻的应用程序 它应该显示 10 条 最新 新闻 现在它显示 10 个最旧的新闻 我该如何更改它 我是否更改控制器以便数据按日期排序 或者我可以在视图中执行吗 控制器 public ActionResul
  • postgres 检测零的重复模式

    有没有办法在 Postgres 的时间序列中检测长度至少为 3 的零子序列 year value 1 0 2 0 3 0 4 33 5 72 6 0 7 0 8 0 9 0 10 25 11 0 12 56 13 37 因此 在此示例中 我
  • 从链接服务器插入存储过程的结果

    是否可以将远程存储过程的结果插入到临时表中 例如 CREATE TABLE test id INT INSERT INTO test EXEC linkedserver remoteDB dbo tst DROP TABLE test 其中
  • Textview 在 Imageview 上滚动,就像 Pulse 应用程序滚动一样

    In my application I want to scroll the text on Image view like Pulse application Need not scroll inside the text view Pl
  • 分离Gdb而不恢复劣质

    Gdb 与任何其他程序一样 并不完美 我时不时会遇到导致当前 Gdb 实例无法使用的错误 此时 如果我有一个调试会话 其中有很多有价值的状态 我希望能够在其上启动一个新的 Gdb 会话 也就是说 分离 退出 Gdb 并启动一个新的 Gdb