我正在用GDB调试我的函数A,在调用函数B之前,我打印了以下值:
p *(key->s->fds[3].handler)结果是:(这些都是函数指针)
$3 = {handle_read = 0x55555555ba49 <socks5_read>, handle_write = 0x55555555baa2 <socks5_write>, handle_block = 0x55555555bb0a <socks5_block>, handle_close = 0x55555555bb15 <socks5_close>}然后,我输入s输入函数B与GDB。紧接着,我再次打印p *(key->s->fds[3].handler),但是它的值是:
$4 = {handle_read = 0x7fffffffdb90, handle_write = 0x5555baa2, handle_block = 0x55555555bb0a <socks5_block>, handle_close = 0x55555555bb15 <socks5_close>}我知道这个问题是公开的,因为我应该展示我的一些代码。但我的问题是一般性的:我的结构的内容是否有可能仅仅通过传递指向函数的指针而改变呢?
如果有帮助,这就是我在GDB中所做工作的完整跟踪:
(gdb) s
31 stm->current->on_arrival(stm->current->state, key);
(gdb) p *(key->s->fds[3].handler)
$3 = {handle_read = 0x55555555ba49 <socks5_read>, handle_write = 0x55555555baa2 <socks5_write>, handle_block = 0x55555555bb0a <socks5_block>,
handle_close = 0x55555555bb15 <socks5_close>}
(gdb) s
hello_read_init (state=0, key=0x7fffffffdb90) at src/stm/stm_hello.c:20
20 hello_stm *hello_stm = &ATTACHMENT(key)->hello_state;
(gdb) p *(key->s->fds[3].handler)
$4 = {handle_read = 0x7fffffffdb90, handle_write = 0x5555baa2, handle_block = 0x55555555bb0a <socks5_block>,
handle_close = 0x55555555bb15 <socks5_close>}发布于 2020-11-02 15:10:47
是否可能仅仅通过传递指向函数的指针就可以更改结构的内容?
我可以想到三个可能的原因(大部分是最不可能的):
key->s->fds[3].handler指向已经返回的帧的堆栈,则该堆栈将被后续的调用指令覆盖。step还不够远。
如果对被调用的函数进行了优化,GDB就有可能停止在hello_read_init prolog (尚未设置寄存器的区域)。key->s->fds[3].handler->handle_read )。使用Address杀菌剂应该立即显示这是否是UB的一个实例(上面的第一种可能性)。
发布于 2022-10-26 14:48:45
除了@Employed俄罗斯语的答案之外,如果您已踏入具有不同预编译器定义的库中的文件,并且在要在GDB中打印的数据中有"#ifdef XXX“字段,则会发生这种情况。我刚遇到这个案子。
例如,假设名为"test_cmd“的二进制文件有-DDEBUG,但是名为"lib_my_cmd”的库没有它。然后你的结构被定义为..。
// my_cmd.h has...
typedef struct {
#ifdef DEBUG
int my_debug_only_field;
#endif
int my_regular_field;
} my_info;
...// my_cmd.c, built as part of lib_my_cmd without -DDEBUG, has...
#include "my_cmd.h"
void do_foo(my_info* inputs) {
// GDB stepping in here, where DEBUG is not defined, the value of
// inputs.my_regular_field is 1. <== Expected to be 0!!!
}// my_foo_test.cc, built in the binary with -DDEBUG, has...
#include "my_cmd.h"
void test_foo() {
my_info inputs;
inputs.my_debug_only_field = 1;
inputs.my_regular_field = 0;
do_foo(&inputs);
//...当您从inputs进入do_foo(...)时,test_foo()字段值会发生变化。
https://stackoverflow.com/questions/64647379
复制相似问题