The previous implementation to locate the call instruction is
to strstr "call", then check whether the previous char is ' '
or '\t'. The implementation is problematic. For example it
cannot resolve the following disassembly string:

"0xffffffffc06e6399 <nfs_callback_up+118>:\tcall   0xffffffff9ac8792f <printk>"

strstr will locate the "_call" and char check fails,
as a result, extract_hex fail to get the calling address.

This patch fix the issue by strstr "\tcall" and " call", to
locate the correct call instruction.

Signed-off-by: Tao Liu <l...@redhat.com>
---
v1 -> v2: No modification, sent together with patch1
---
 x86_64.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/x86_64.c b/x86_64.c
index dfada48..74bd1bb 100644
--- a/x86_64.c
+++ b/x86_64.c
@@ -4432,8 +4432,7 @@ x86_64_function_called_by(ulong rip)
        if (gdb_pass_through(buf, pc->tmpfile2, GNU_RETURN_ON_ERROR)) {
                rewind(pc->tmpfile2);
                while (fgets(buf, BUFSIZE, pc->tmpfile2)) {
-                       if ((p1 = strstr(buf, "call")) &&
-                           whitespace(*(p1-1))) { 
+                       if ((p1 = strstr(buf, " call")) || (p1 = strstr(buf, 
"\tcall"))) {
                                if (extract_hex(p1, &value, NULLCHAR, TRUE)) 
                                        break;
                        }
-- 
2.33.1

--
Crash-utility mailing list
Crash-utility@redhat.com
https://listman.redhat.com/mailman/listinfo/crash-utility
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to