0

0

等待调试器

WBOY

WBOY

发布时间:2024-08-05 15:33:02

|

1018人浏览过

|

来源于dev.to

转载

等待调试器

介绍

使用 gdb 或 lldb 等调试器时,通常您:

  1. 运行调试器并指定程序可执行文件的名称。
  2. 设置断点。
  3. 从调试器中运行您的程序。

但是,某些程序是通过 fork() 和 exec() 从守护程序启动或作为管道的一部分启动。 如果程序本身是守护进程(或其他长时间运行的进程),您可以简单地将调试器附加到程序的运行进程中。 但是,如果您的程序是短暂的,那么在您将调试器附加到它之前,它早已完成执行。 需要的是一种运行程序的方法,但让它立即暂停并无限期地等待您附加调试器。

等待

c 标准库包含 raise() 函数,该函数向当前进程发送信号。 posix 定义了 sigstop 信号,该信号使程序停止并无限期地等待,直到收到 sigcont 信号(当您输入 continue 命令时调试器恰好发送该信号),这正是我们想要的。这是一个可以做到这一点的函数:

void wait_for_debugger_attach( void ) {
  fprintf( stderr,
    "%s: pid=%d: waiting for debugger to attach...\n",
    me, (int)getpid()
  );
  if ( raise( sigstop ) == -1 ) {
    perror( me );
    exit( ex_oserr );
  }
}
sigstop 与调试器本身发送到进程以在遇到断点时暂停其执行的信号相同。

首先,我们打印一条包含进程 id 的消息,以便您知道将调试器附加到哪个进程。 然后我们通过引发 sigstop 等待。为了稳健起见,我们检查 raise() 的返回值:如果是 -1,则发生错误,因此通过 perror() 打印出来并退出。

变量 me 是全局变量,并在 main() 中设置为 argv[0] 的基本名称,即可执行文件的名称。

有条件等待

当然,只有在实际调试程序时才需要调用 wait_for_debugger_attach()。 有几种方法可以让你的程序知道情况是这样的:

  1. 通过命令行选项,例如 --debug。
  2. 通过文件的存在,例如 ~/.foo_debug (其中 foo 将替换为您的程序的名称)。
  3. 通过环境变量,例如 foo_debug。

其中,我最喜欢#3,因为它是最难意外完成的,因为必须在父进程的环境中设置环境变量才能被程序继承。 (您不希望生产中的程序运行然后立即无限期地等待。)

西亚购物系统 2004
西亚购物系统 2004

一套自选网上商城精美模版,自主商品管理,自行网店经营的网上商城平台,系统具有强大的商品管理、购物车、订单统计、会员管理等功能,同时拥有灵活多变的商品管理、新闻管理等功能,功能强劲的后台管理界面,无需登录FTP,通过IE浏览器即可管理整个网站。西亚购物平台经多方面权威调查和研究为您精心开发了很多特色实用功能。使商品展示、管理、服务全面升级。西亚购物平台为您提供了多款专业美观的店面样式、俱备完整的购物

下载

因此,在main()中,我们可以这样做:

int main( int argc, char const *argv[] ) {
  me = basename( argv[0] );
  if ( getenv( "foo_debug" ) != null )
    wait_for_debugger_attach();
  // ...
}

其中 getenv() 仅当给定的环境变量存在时才返回非 null。 (它的值,即使是空的,也没关系。)

细节

如果你想让你的程序更难意外地无限期等待,你可以检查环境变量的“肯定”值。 我们可以通过添加几个辅助函数来做到这一点:

bool str_is_any( char const *s,
                 char const *const matches[const static 2] ) {
  if ( s != null ) {
    for ( char const *const *match = matches; *match != null; ++match ) {
      if ( strcasecmp( s, *match ) == 0 )
        return true;
    }
  }
  return false;
}

bool str_is_affirmative( char const *s ) {
  static char const *const affirmatives[] = {
    "1", "t", "true", "y", "yes", null
  };
  return str_is_any( s, affirmatives );
}

如果你不知道 const static 2 在 c 中的作用,请参阅此处。 在 c++ 程序中,只需省略此即可。

然后将main()中的代码更改为:

  if ( str_is_affirmative( getenv( "FOO_DEBUG" ) ) )
    wait_for_debugger_attach();

结论

有条件地使用 sigstop 是调试以命令行以外的方式启动的程序的好方法。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

235

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

437

2024.03.01

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

527

2023.09.20

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

256

2025.10.24

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

78

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

96

2025.09.18

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

4

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

6

2026.01.26

苹果官方查询网站 苹果手机正品激活查询入口
苹果官方查询网站 苹果手机正品激活查询入口

苹果官方查询网站主要通过 checkcoverage.apple.com/cn/zh/ 进行,可用于查询序列号(SN)对应的保修状态、激活日期及技术支持服务。此外,查找丢失设备请使用 iCloud.com/find,购买信息与物流可访问 Apple (中国大陆) 订单状态页面。

16

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.6万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号