相关疑难解决方法(0)

main()真的是一个C++程序的开始吗?

C++标准中的$ 3.6.1/1节,

程序应包含一个名为main的全局函数,它是程序的指定开始.

现在考虑这段代码,

int square(int i) { return i*i; }
int user_main()
{ 
    for ( int i = 0 ; i < 10 ; ++i )
           std::cout << square(i) << endl;
    return 0;
}
int main_ret= user_main();
int main() 
{
        return main_ret;
}
Run Code Online (Sandbox Code Playgroud)

此示例代码执行我打算执行的操作,即进入main()应该是程序"开始" 的函数之前打印从0到9的整数平方.

我还用-pedantic选项GCC 4.5.0 编译它.它没有错误,甚至没有警告!

所以我的问题是,

这段代码真的符合标准吗?

如果它符合标准,那么它是否会使标准所说的无效?main()不是这个计划的开始!user_main()在执行之前执行main().

我知道要初始化全局变量main_ret,use_main()首先执行,但这是完全不同的事情; 关键是,它确实使标准中的引用语句$ 3.6.1/1无效,因为main() …

c++ program-entry-point standards-compliance entry-point

130
推荐指数
6
解决办法
2万
查看次数

如何在GDB中自动运行可执行文件?

我想gdb立即运行可执行文件,就像我输入"run"一样(动机:我不喜欢输入"run").

一种方法是将命令管道输出为gdb:

$ echo run | gdb myApp
Run Code Online (Sandbox Code Playgroud)

但是这种方法的问题在于你失去了与之交互gdb,例如.如果断点触发或myApp崩溃,则gdb退出.这里讨论这种方法.

看看中的选项--help,我没有看到这样做的方法,但也许我错过了一些东西.

gdb

82
推荐指数
4
解决办法
3万
查看次数

如何在main之前调试崩溃?

我的程序在访问gdb中的main之前静态链接到许多库和崩溃.我如何诊断问题是什么?

c gdb

8
推荐指数
1
解决办法
5639
查看次数

为什么在_start之前调用glibc的csu/init-first.c _init,即使_start是ELF入口点?

我在玩GDB时首先注意到它rbreak .,然后做了一个最小的例子:

(gdb) file hello_world.out
Reading symbols from hello_world.out...done.
(gdb) b _init
Breakpoint 1 at 0x4003e0
(gdb) b _start
Breakpoint 2 at 0x400440
(gdb) run
Starting program: /home/ciro/bak/git/cpp/cheat/gdb/hello_world.out

Breakpoint 1, _init (argc=1, argv=0x7fffffffd698, envp=0x7fffffffd6a8) at ../csu/init-first.c:52
52  ../csu/init-first.c: No such file or directory.
(gdb) continue
Continuing.

Breakpoint 2, 0x0000000000400440 in _start ()
(gdb) continue
Continuing.

Breakpoint 1, 0x00000000004003e0 in _init ()
(gdb) info breakpoints
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   <MULTIPLE>
    breakpoint already hit …
Run Code Online (Sandbox Code Playgroud)

c linux gcc gdb glibc

7
推荐指数
1
解决办法
1728
查看次数

如何强制 gdb 在程序执行开始后立即停止?

我试图在每个有意义的函数上设置断点,但程序在到达任何一个之前退出。有没有办法让程序从一开始就以分步模式运行,这样我就可以看到发生了什么?

我正在尝试调试 /usr/bin/id 如果它很重要(我们有自定义插件并且它行为不端)

PS Start 命令在这里对我不起作用(它应该是评论,但我没有足够的代表)

debugging gdb

5
推荐指数
3
解决办法
3766
查看次数

如何使用 GDB 调试共享对象库中的函数?

我正在尝试验证共享对象库中函数的功能。在具有函数的程序中main,我会简单地让start程序和 gdb 会自动在 main 上设置断点,但这显然在这里不可用。

假设我有一些add.c

long add(long x, long y) {
    return x + y;
}
Run Code Online (Sandbox Code Playgroud)

我用以下命令编译它并将gcc -shared -o libadd.so -fPIC add.c其加载到 GDB 中:

(gdb) file libadd.so
Reading symbols from libadd.so...(no debugging symbols found)...done.
(gdb) start
Function "main" not defined.
Make breakpoint pending on future shared library load? (y or [n])
Starting program: /tmp/minimal/libadd.so

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000001 in ?? ()
Run Code Online (Sandbox Code Playgroud)

最好,我希望能够使用类似于下面的 gdb:

(gdb) file libadd.so
Reading symbols …
Run Code Online (Sandbox Code Playgroud)

c debugging gdb reverse-engineering

5
推荐指数
1
解决办法
432
查看次数

GDB - 未来共享库加载时的断点挂起

我正在尝试在 GDB 中运行一个非常简单的链接文件。

我做了以下操作:

(gdb) break _start
Breakpoint 1 at 0x4000b0
(gdb) start
Function "main" not defined.
**Make breakpoint pending on future shared library load? (y or [n]) ?**
Run Code Online (Sandbox Code Playgroud)

但是,标签_start不在任何共享库中,而只是在生成可执行文件的汇编代码中。为什么GDB会问这个?

assembly gdb

0
推荐指数
1
解决办法
4676
查看次数