如何在开始时停止程序以便将 GDB 附加到该程序?

How to stop a program at the beginning in order to attach GDB to that?

我想在我的 C++ 程序开始时显示一个 PID 并发送一个等待信号,这样我就可以在另一个终端中 运行 gdb - PID。然后在 gdb 终端中按 run,程序应该继续。

如果我用

   pid_t pid = getpid();
   cout << "PID = " << pid << endl;
   raise(SIGSTOP);

我在输出中看到了这个

$ ./run
PID = 30261

[1]+  Stopped                 ./run
$

因此,程序进入后台并停止。另一方面,如果我使用 SIGINT,我会看到

$ ./run
PID = 8790
Caught signal: 2
$ 

我该如何解决?

您不需要使用信号来暂停您的应用程序,您可以等待您感兴趣的某个信号。

int main(){
    std::cout << "PID = "  << getpid() << std::endl;

    int sig;
    sigset_t signal_set;

    sigemptyset(&signal_set);
    sigaddset(&signal_set, SIGCONT); 
    sigwait( &signal_set, &sig  );
 
    std::cout << "continued"  << std::endl;
}

So, the program goes in the background and stops

是什么阻止您附加到已停止的进程?

您现在可以附加到 pid 号为 30261 的进程并继续执行程序。另见相关问题 wait for gdb to attach

gdb ./run 30261