[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
--//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
浙公网安备 33010602011771号