等待调试器

等待调试器

介绍

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

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

但是,某些程序是通过 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()。 有几种方法可以让你的程序知道情况是这样的:

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

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

因此,在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 是调试以命令行以外的方式启动的程序的好方法。

以上就是等待调试器的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1456591.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月18日 08:56:28
下一篇 2025年12月12日 10:48:06

相关推荐

  • 探索C++框架中的插件和扩展性

    在 c++++ 框架中,插件和扩展性使构建灵活且可扩展的应用程序成为可能。插件是独立的代码模块,可动态加载以扩展框架功能,而扩展性机制(如钩子函数和反射)允许自定义或替换框架组件。通过示例,我们展示了如何使用插件(如 websocket 支持插件)和扩展性来增强 c++ 框架。 探索 C++ 框架中…

    2025年12月18日
    000
  • 揭秘C++框架的配置和加载过程

    c++++ 框架配置过程涉及设置编译选项、链接标志和其他参数,以确保在特定环境中正确运行。加载过程包括实例化框架对象、初始化它并使用其提供的组件和服务。实战案例演示了使用 qt 框架配置和加载 gui 应用程序的过程,其中 qtconfig 用于设置编译选项,而 qapplication 类实例化并…

    2025年12月18日
    000
  • C++框架内置功能在数据处理领域的优化

    数据处理领域的 c++++ 框架优化:排序和搜索: 针对现代硬件优化,提供高效算法(如快速排序)。内存管理: 提供引用计数和垃圾回收等机制,实现自动内存管理。多线程: 提供创建和管理线程的函数,充分利用多核处理器,提高并行性。 C++ 框架内置功能在数据处理领域的优化 C++ 框架提供了广泛的内置功…

    2025年12月18日
    000
  • C++框架内置功能有哪些安全方面的考虑?

    使用 c++++ 框架内置功能时,应注意安全隐患,包括数据验证、输入过滤、会话管理、授权和漏洞利用。为了防止如 xss 攻击之类的安全问题,建议:1. 使用白名单;2. 避免自动转义;3. 进行上下文相关验证;4. 使用服务器端验证。此外,定期更新框架和修补已知漏洞至关重要。 C++ 框架内建功能的…

    2025年12月18日
    000
  • 深入探究C++框架中的线程和并发处理

    线程和并发处理是c++++框架中提高应用程序性能的关键技术,利用std::thread类可轻松创建和管理线程。通过实战案例,本指南展示如何并行计算数组和的步骤:创建与处理器内核数量相同的线程。计算每个线程处理的数组片段大小。创建线程并并行计算和。等待所有线程完成。计算最终结果并打印。 深入探究C++…

    2025年12月18日
    000
  • C++框架在计算机视觉方面的应用场景有哪些?

    c++++ 框架在计算机视觉中广泛应用,包括图像处理算法(如图像转换和滤波)、目标检测和识别(如人脸检测)、视频分析(如运动检测)、增强现实(如叠加计算机图形)等领域,此外还有医疗图像处理、自动驾驶、视觉手势识别和生物特征认证等潜在应用。 C++框架在计算机视觉中的应用场景 C++ 框架因其速度、效…

    2025年12月18日
    000
  • C++开源框架的许可类型有哪些?

    c++++ 开源框架的许可类型决定了框架的使用及修改方式。常见的许可类型包括:apache 许可证 2.0:允许商业和非商业使用、修改和 re发布,但需保留版权声明。mit 许可证:允许商业和非商业使用、修改和 re发布,无需保留版权声明。bsd 许可证:允许商业和非商业使用、修改和 re发布,需保…

    2025年12月18日
    000
  • C++框架中的不同许可条款如何比较?

    答案:选择 c++++ 框架的许可条款取决于项目的特定需求和目标。详细描述:mit 许可证:免费使用、修改和分发,无版税或其他要求。bsd 许可证:与 mit 类似,但要求保留版权声明和免责条款。apache 许可证 2.0 版:更严格,要求保留版权和许可声明,以及清晰说明关联。gnu 通用公共许可…

    2025年12月18日
    000
  • 限制C++框架商业使用的许可条款有哪些?

    使用 c++++ 框架进行商业开发时,了解许可条款至关重要,因为它规定了代码的使用和分发方式。常见许可条款包括:mit 许可证:允许商业和非商业使用、复制和修改代码。apache 2.0 许可证:类似 mit 许可证,但要求包括版权和许可证通知。gnu 通用公共许可证 (gpl):要求衍生作品也采用…

    2025年12月18日
    000
  • 哪些开源C++框架可以用于商业目的?

    是的,商业应用可以使用开源 c++++ 框架,这可以带来显着的优势,包括:免费的使用、修改和分发(得益于许可证的灵活性)强大的功能和广泛的社区支持持续的开发 如何在商业项目中使用开源 C++ 框架 在商业应用中使用开源 C++ 框架可以带来显著的优势。得益于其许可证的灵活性,开发者可以免费使用、修改…

    2025年12月18日
    000
  • C++框架如何使用内置功能解决常见问题?

    c++++ 框架解决常见编码问题的内置功能包括:异常处理:std::exception_ptr 和 std::rethrow_if_nested 用于处理嵌套异常。字符串处理:std::string 中的 find()、replace() 和 to_upper() 用于高效操作字符串内容。容器操作:…

    2025年12月18日
    000
  • C++框架的双重许可类型介绍

    c++++ 框架提供双重许可:开源许可(如 mit)和商业许可。开源许可允许自由使用和修改,而商业许可提供支持和保护,并限制了使用。根据项目的类型、修改限制和支持需求来选择许可类型。 C++ 框架的双重许可类型:简介 许多开源的 C++ 框架同时提供两种许可类型:开源许可(例如,MIT、GPL)和商…

    2025年12月18日
    000
  • C++框架在机器人学中扮演什么角色?

    c++++ 框架在机器人学中的重要性在于:简化开发过程:提供预构建的代码库和模块化组件,使开发人员专注于独特功能;降低复杂性:提供标准化接口,简化模块通信,避免从头开始编写代码;提高可维护性:一致的代码结构和文档,便于理解、修改和扩展,并支持代码重用,减少错误。 C++ 框架在机器人学中的重要性 C…

    2025年12月18日
    000
  • C++框架在物联网应用中的作用是什么?

    c++++ 框架在物联网中发挥着至关重要的作用,提供高效性、可扩展性、安全性以及丰富的生态系统。通过使用 mongoose os 等框架,开发人员可以创建连接、数据采集和远程管理物联网设备的可靠和可扩展的解决方案。 C++ 框架在物联网应用中的作用 引言 随着物联网 (IoT) 技术的兴起,为 C+…

    2025年12月18日
    000
  • C++框架的CECILL许可类型须知

    c++ecill 许可证适用于 c++ 框架,允许商业使用和保持开放源代码性质。该许可证提供以下好处:商业可用性:可用于专有产品。开放源代码:允许查看、修改和分发源代码。务实的许可条件:易于采用和遵守。以 viapo 框架为例,它使用 cecill 许可证,允许我们创建专有服务器应用程序,同时保持代…

    2025年12月18日
    000
  • C++框架的Apache许可类型综述

    c++++ 框架的 apache 许可证允许用户在遵守特定条款的情况下修改和分发软件,包括:apache 2.0 许可证:允许用户在任何情况下自由使用、修改和分发软件,但必须保留版权和许可证声明。apache 1.1 许可证:允许用户免费使用和修改软件,但限制商业使用,并且需要保留版权和许可证声明。…

    2025年12月18日
    000
  • C++框架在人工智能领域的适用性如何?

    c++++框架在人工智能领域具有适用性,原因包括:高性能,处理复杂的计算任务;低延迟,确保实时操作;资源效率,节省内存;可扩展性,支持大型数据集和算法;生态系统丰富,提供大量库和工具。实战案例:tensorflow:训练和部署机器学习模型;pytorch:动态深度学习,构建和训练复杂模型;caffe…

    2025年12月18日
    000
  • C++框架的BSD许可类型详解

    在 c++++ 框架中,bsd 许可证允许开发人员免费使用、修改和分发软件。bsd 许可证有两种类型:2 条款 bsd 许可证要求附上版权声明和免责声明,而 3 条款 bsd 许可证增加了商标条款。bsd 许可证在 c++ 框架中很受欢迎,因为它允许自由修改、不产生版税费用,并有助于社区发展。遵守 …

    2025年12月18日
    000
  • C++框架在网络安全方面的应用场景有哪些?

    c++++ 框架在网络安全中的应用包括:漏洞扫描和渗透测试:识别系统弱点,例如使用 c++ 脚本进行端口扫描和 exploit 开发。入侵检测与防御系统 (ids/ips):实时监控网络流量并检测恶意活动,例如使用模式匹配和流量分析。模拟和建模:研究威胁和评估防御策略,例如创建 c++ 模型模拟网络…

    2025年12月18日
    000
  • C++框架在社交媒体领域的适用性如何?

    在社交媒体领域,c++++ 框架因其高性能、可伸缩性和灵活性而被广泛使用。它们提供了无缝集成第三方库和服务的能力,并支持多线程和分布式架构,以处理海量并发用户。使用 c++ 框架的成功案例包括 facebook 广告 sdk 和 twitter api,其中 instagram 和 pinteres…

    2025年12月18日
    000

发表回复

登录后才能评论
关注微信