[20260918]gdb下如何调用skgmhash函数.txt

[20260918]gdb下如何调用skgmhash函数.txt

--//kimi给出的答案:

可以,但建议只在测试/可控环境 attach 调用;生产关键进程上直接 call 有把进程搞崩的风险。
gdb

(gdb) attach <oracle_server_pid>
(gdb) p (unsigned int) skgmhash((char *)"u01/app/oracle", 14)

如果没有符号,用地址强转:
gdb

(gdb) p ((unsigned int (*)(char *, unsigned long))0x57909b0)((char *)"abc", 3)

注意按你这份 x86-64 汇编写,参数约定是:

c

uint32_t skgmhash(const char *rdi_ptr, uint64_t rsi_len);

gdb 里我习惯把长度显式写成 3、14 这种,避免把字符串尾 NUL 算进去。返回值在 eax/rax 低 32 位。

几个坑:

skgmhash 本身看起来是纯计算、不碰 SGA 全局状态,所以相对适合手调;
但不要在被持有关键 latch / 正在做内存分配的路径上反复 call;
若是 no-symbol/裁剪符号环境,用 info symbol 0x57909b0 或直接用反汇编地址;
传参类型错了很容易崩,尤其第二个参数长度要按指针实际长度算。

--//直接贴出测试结果:

(gdb) p /x (unsigned int) skgmhash((char *)"abc", 3)
$2 = 0x3191a18

(gdb) p /x (unsigned int) skgmhash((char *)"/u01/app/oracle/product/21.0.0/dbhome_1book", 43)
$7 = 0xafa94c20

(gdb) p /x ((unsigned int (*)(char *, unsigned long))0x57909b0)((char *)"/u01/app/oracle/product/21.0.0/dbhome_1book", 43)
$6 = 0xafa94c20

--//0x57909b0 是 skgmhash的开始地址。

(gdb) x /3i 0x57909b0
   0x57909b0 <skgmhash>:        xchg   %ax,%ax
   0x57909b2 <skgmhash+2>:      push   %rbp
   0x57909b3 <skgmhash+3>:      mov    %rsp,%rbp

(gdb) info symbol 0x57909b0
skgmhash in section .text of /u01/app/oracle/product/21.0.0/dbhome_1/bin/oracle

(gdb) info symbol 0x57909b1
skgmhash + 1 in section .text of /u01/app/oracle/product/21.0.0/dbhome_1/bin/oracle

posted @ 2026-09-21 21:25  lfree  阅读(3)  评论(0)    收藏  举报