Debugging 断点有两个地址?

Debugging 断点有两个地址?,debugging,assembly,gdb,breakpoints,Debugging,Assembly,Gdb,Breakpoints,我最近设置了一个断点,初始地址为: (gdb) b viewscreen_movieplayerst::create(char, viewscreenst*) Breakpoint 1 at 0x804beec 第二个通常的地址是: (gdb) run Breakpoint 1, 0xf7b46630 in viewscreen_movieplayerst::create(char,viewscreenst*)() from/path/libs/libgraphic

我最近设置了一个断点,初始地址为:

(gdb) b viewscreen_movieplayerst::create(char, viewscreenst*)
Breakpoint 1 at 0x804beec
第二个通常的地址是:

   (gdb) run

   Breakpoint 1, 0xf7b46630 
   in viewscreen_movieplayerst::create(char,viewscreenst*)()
   from/path/libs/libgraphics.so
这是因为可执行文件被剥离了吗?还是执行了可执行文件,执行后地址发生了变化

此外,主要问题是:

(gdb) b main 
Breakpoint 1 at 0x804bdec
看起来和地址很接近,所以我会把它包括进去

编辑:


也许您看到的是Unix上共享库函数中的过程链接表PLT地址

编译器构建一个“蹦床”地址表,间接引用共享库依赖项。这是一个复杂的话题,有一篇详细的文章

下面是一个简单的例子

lib.cpp

#include <iostream>


int foo()
{
  return 0;
}
gdb流浪汉

Reading symbols from tramp...done.
(gdb) p foo
$1 = (<text from jump slot in .got.plt, no debug info>) 0x4006d6 <foo()@plt+6>
(gdb) b foo
Breakpoint 1 at 0x4006d0
(gdb) d 1
(gdb) r
Starting program: /tmp/tramp 
lib:  0x602010
[Inferior 1 (process 12804) exited normally]
(gdb) b foo
Breakpoint 2 at 0x4006d0 (2 locations)
(gdb) info break
Num     Type           Disp Enb Address            What
2       breakpoint     keep y   <MULTIPLE>         
2.1                         y     0x00000000004006d0 <foo()@plt>
2.2                         y     0x00002aaaaacd0a99 in foo() at lib.cpp:6
如您所见,符号“foo”有两个地址和两个断点。一个是PLT,另一个是共享库中的符号位置


正如注释所指出的,模板实例化和编译器优化还可以为一个符号或源代码行创建多个地址

你的问题我不太清楚。如果运行时地址不同,可以使用info break进行检查,然后是的,这可能是运行时重新定位。如果它实际上有两个地址,那么这可能是由于各种编译器优化造成的。@Tom Tromey在什么情况下它会有两个地址?如果不是,你给了我一个我一直在寻找的运行时重新定位的流行语,因为内联和重载解析,一个函数可能有多个地址。是的,内联。也有相关的优化,但更为罕见。另外,如果您正在设置一个file:line断点,您可以看到由于模板实例化而产生的多个地址-通常每个实例化都会命中一次。是的,肯定与过程链接表有关。我意识到预执行地址对应于我创建的objdump-d文件中的地址。非常感谢。
/tmp$ g++ -fPIC -g -std=c++11 -shared -o libtest_library.so lib.cpp
/tmp$ g++  -g -std=c++11  -o tramp junk.cpp -L . -l test_library
Reading symbols from tramp...done.
(gdb) p foo
$1 = (<text from jump slot in .got.plt, no debug info>) 0x4006d6 <foo()@plt+6>
(gdb) b foo
Breakpoint 1 at 0x4006d0
(gdb) d 1
(gdb) r
Starting program: /tmp/tramp 
lib:  0x602010
[Inferior 1 (process 12804) exited normally]
(gdb) b foo
Breakpoint 2 at 0x4006d0 (2 locations)
(gdb) info break
Num     Type           Disp Enb Address            What
2       breakpoint     keep y   <MULTIPLE>         
2.1                         y     0x00000000004006d0 <foo()@plt>
2.2                         y     0x00002aaaaacd0a99 in foo() at lib.cpp:6