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() …
我想gdb立即运行可执行文件,就像我输入"run"一样(动机:我不喜欢输入"run").
一种方法是将命令管道输出为gdb:
$ echo run | gdb myApp
Run Code Online (Sandbox Code Playgroud)
但是这种方法的问题在于你失去了与之交互gdb,例如.如果断点触发或myApp崩溃,则gdb退出.这里讨论这种方法.
看看中的选项--help,我没有看到这样做的方法,但也许我错过了一些东西.
我在玩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) 我试图在每个有意义的函数上设置断点,但程序在到达任何一个之前退出。有没有办法让程序从一开始就以分步模式运行,这样我就可以看到发生了什么?
我正在尝试调试 /usr/bin/id 如果它很重要(我们有自定义插件并且它行为不端)
PS Start 命令在这里对我不起作用(它应该是评论,但我没有足够的代表)
我正在尝试验证共享对象库中函数的功能。在具有函数的程序中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) 我正在尝试在 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会问这个?