讲师中心 微信公众号
AI工具推荐 视频效率加速

等待调试器

雨萱吖_9569

雨萱吖_9569

发布时间: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,因为它是最难意外完成的,因为必须在父进程的环境中设置环境变量才能被程序继承。 (您不希望生产中的程序运行然后立即无限期地等待。)

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

因此,在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大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

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

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

549

2023.09.22

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

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

1698

2024.03.01

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

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

2298

2023.09.20

java break和continue
java break和continue

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

807

2025.10.24

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

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

4845

2025.09.18

python 全局变量
python 全局变量

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

2030

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

20

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn