From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6094 invoked by alias); 21 Jul 2009 08:23:28 -0000 Received: (qmail 6085 invoked by uid 22791); 21 Jul 2009 08:23:26 -0000 X-SWARE-Spam-Status: No, hits=-1.1 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_43,J_CHICKENPOX_44,SARE_MSGID_LONG40,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail-pz0-f203.google.com (HELO mail-pz0-f203.google.com) (209.85.222.203) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 21 Jul 2009 08:23:19 +0000 Received: by pzk41 with SMTP id 41so2191589pzk.12 for ; Tue, 21 Jul 2009 01:23:17 -0700 (PDT) MIME-Version: 1.0 Received: by 10.142.223.20 with SMTP id v20mr1345442wfg.316.1248164597646; Tue, 21 Jul 2009 01:23:17 -0700 (PDT) From: Hui Zhu Date: Tue, 21 Jul 2009 15:39:00 -0000 Message-ID: Subject: [PREC/RFA] Add not_replay to make precord support release memory better To: gdb-patches ml Cc: Michael Snyder Content-Type: multipart/mixed; boundary=000e0cd28d4a76c810046f32f742 X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-07/txt/msg00508.txt.bz2 --000e0cd28d4a76c810046f32f742 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-length: 8451 Hi, Now, in replay reverse mode, if get error with memory entry, it will output error. But it just affect the operation with this part of memory. So I make a patch to let it set the not_replay in memory entry to 1 in this status. When replay forward mode, this memory entry will not really set to memory. For example: #include #include #include #include #include #include #include #include #include #include int main(int argc,char *argv[],char *envp[]) { char *buf; buf = mmap (0, 1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (buf == (caddr_t) -1) { perror ("mmap"); return (-errno); } buf[0] = 1; munmap (buf, 1024); return (0); } Before patch: gdb ~/gdb/a.out GNU gdb (GDB) 6.8.50.20090720-cvs Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-pc-linux-gnu". For bug reporting instructions, please see: ... Setting up the environment for debugging gdb. Function "internal_error" not defined. Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal] Function "info_command" not defined. Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal] /home/teawater/gdb/bgdbno/gdb/.gdbinit:8: Error in sourced command file: No breakpoint number 0. (gdb) start During symbol reading, DW_AT_name missing from DW_TAG_base_type. Temporary breakpoint 1 at 0x8048425: file 1.c, line 17. Starting program: /home/teawater/gdb/a.out Temporary breakpoint 1, main (argc=, argv=, envp=) at 1.c:17 17 buf = mmap (0, 1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); (gdb) record (gdb) n During symbol reading, incomplete CFI data; unspecified registers (e.g., eax) at 0x8048422. 18 if (buf == (caddr_t) -1) { (gdb) 23 buf[0] = 1; (gdb) 25 munmap (buf, 1024); (gdb) The next instruction is syscall munmap. It will free the memory addr = 0xb7fe0000 len = 1024. It will make record target get error. Do you want to stop the program?([y] or n) n 27 return (0); (gdb) rc Continuing. Process record: error reading memory at addr = 0xb7fe0000 len = 1. (gdb) After patch: ./gdb ~/gdb/a.out GNU gdb (GDB) 6.8.50.20090721-cvs Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-pc-linux-gnu". For bug reporting instructions, please see: ... Setting up the environment for debugging gdb. Function "internal_error" not defined. Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal] Function "info_command" not defined. Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal] /home/teawater/gdb/bgdbno/gdb/.gdbinit:8: Error in sourced command file: No breakpoint number 0. (gdb) start During symbol reading, DW_AT_name missing from DW_TAG_base_type. Temporary breakpoint 1 at 0x8048425: file 1.c, line 17. Starting program: /home/teawater/gdb/a.out Temporary breakpoint 1, main (argc=, argv=, envp=) at 1.c:17 17 buf = mmap (0, 1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); (gdb) record (gdb) n During symbol reading, incomplete CFI data; unspecified registers (e.g., eax) at 0x8048422. 18 if (buf == (caddr_t) -1) { (gdb) 23 buf[0] = 1; (gdb) 25 munmap (buf, 1024); (gdb) The next instruction is syscall munmap. It will free the memory addr = 0xb7fe0000 len = 1024. It will make record target get error. Do you want to stop the program?([y] or n) n 27 return (0); (gdb) rc Continuing. No more reverse-execution history. main (argc=, argv=, envp=) at 1.c:17 17 buf = mmap (0, 1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); (gdb) n 18 if (buf == (caddr_t) -1) { (gdb) 23 buf[0] = 1; (gdb) 25 munmap (buf, 1024); (gdb) rn 23 buf[0] = 1; Please help me review it. Thanks, Hui 2009-07-21 Hui Zhu * record.c (record_mem_entry): Add not_replay. If this the memory entry doesn't replay, it will set to 1. (record_arch_list_add_mem): Initialize not_replay to 0. (record_wait): In replay reverse mode, if get error with memory entry, not output error, just set not_replay to 1. In replay forward mode, if not_replay is set, don't set memory entry to memory. --- record.c | 75 ++++++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 50 insertions(+), 25 deletions(-) --- a/record.c +++ b/record.c @@ -51,6 +51,7 @@ struct record_mem_entry { CORE_ADDR addr; int len; + int not_replay; gdb_byte *val; }; @@ -275,6 +276,7 @@ record_arch_list_add_mem (CORE_ADDR addr rec->type = record_mem; rec->u.mem.addr = addr; rec->u.mem.len = len; + rec->u.mem.not_replay = 0; if (target_read_memory (addr, rec->u.mem.val, len)) { @@ -727,32 +729,55 @@ record_wait (struct target_ops *ops, else if (record_list->type == record_mem) { /* mem */ - gdb_byte *mem = alloca (record_list->u.mem.len); - if (record_debug > 1) - fprintf_unfiltered (gdb_stdlog, - "Process record: record_mem %s to " - "inferior addr = %s len = %d.\n", - host_address_to_string (record_list), - paddress (gdbarch, record_list->u.mem.addr), - record_list->u.mem.len); - - if (target_read_memory - (record_list->u.mem.addr, mem, record_list->u.mem.len)) - error (_("Process record: error reading memory at " - "addr = %s len = %d."), - paddress (gdbarch, record_list->u.mem.addr), - record_list->u.mem.len); - - if (target_write_memory - (record_list->u.mem.addr, record_list->u.mem.val, - record_list->u.mem.len)) - error (_ - ("Process record: error writing memory at " - "addr = %s len = %d."), - paddress (gdbarch, record_list->u.mem.addr), - record_list->u.mem.len); + if (record_list->u.mem.not_replay + && execution_direction != EXEC_REVERSE) + record_list->u.mem.not_replay = 0; + else + { + gdb_byte *mem = alloca (record_list->u.mem.len); + if (record_debug > 1) + fprintf_unfiltered (gdb_stdlog, + "Process record: record_mem %s to " + "inferior addr = %s len = %d.\n", + host_address_to_string (record_list), + paddress (gdbarch, + record_list->u.mem.addr), + record_list->u.mem.len); - memcpy (record_list->u.mem.val, mem, record_list->u.mem.len); + if (target_read_memory (record_list->u.mem.addr, mem, + record_list->u.mem.len)) + { + if (execution_direction != EXEC_REVERSE) + error (_("Process record: error reading memory at " + "addr = %s len = %d."), + paddress (gdbarch, record_list->u.mem.addr), + record_list->u.mem.len); + else + record_list->u.mem.not_replay = 1; + } + else + { + if (target_write_memory (record_list->u.mem.addr, + record_list->u.mem.val, + record_list->u.mem.len)) + { + if (execution_direction != EXEC_REVERSE) + error (_("Process record: error writing memory at " + "addr = %s len = %d."), + paddress (gdbarch, record_list->u.mem.addr), + record_list->u.mem.len); + else + { + record_list->u.mem.not_replay = 1; + } + } + else + { + memcpy (record_list->u.mem.val, mem, + record_list->u.mem.len); + } + } + } } else { --000e0cd28d4a76c810046f32f742 Content-Type: text/plain; charset=US-ASCII; name="prec-mem-not-replay.txt" Content-Disposition: attachment; filename="prec-mem-not-replay.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fxed2iw50 Content-length: 4494 LS0tCiByZWNvcmQuYyB8ICAgNzUgKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAxIGZp bGUgY2hhbmdlZCwgNTAgaW5zZXJ0aW9ucygrKSwgMjUgZGVsZXRpb25zKC0p CgotLS0gYS9yZWNvcmQuYworKysgYi9yZWNvcmQuYwpAQCAtNTEsNiArNTEs NyBAQCBzdHJ1Y3QgcmVjb3JkX21lbV9lbnRyeQogewogICBDT1JFX0FERFIg YWRkcjsKICAgaW50IGxlbjsKKyAgaW50IG5vdF9yZXBsYXk7CiAgIGdkYl9i eXRlICp2YWw7CiB9OwogCkBAIC0yNzUsNiArMjc2LDcgQEAgcmVjb3JkX2Fy Y2hfbGlzdF9hZGRfbWVtIChDT1JFX0FERFIgYWRkcgogICByZWMtPnR5cGUg PSByZWNvcmRfbWVtOwogICByZWMtPnUubWVtLmFkZHIgPSBhZGRyOwogICBy ZWMtPnUubWVtLmxlbiA9IGxlbjsKKyAgcmVjLT51Lm1lbS5ub3RfcmVwbGF5 ID0gMDsKIAogICBpZiAodGFyZ2V0X3JlYWRfbWVtb3J5IChhZGRyLCByZWMt PnUubWVtLnZhbCwgbGVuKSkKICAgICB7CkBAIC03MjcsMzIgKzcyOSw1NSBA QCByZWNvcmRfd2FpdCAoc3RydWN0IHRhcmdldF9vcHMgKm9wcywKIAkgIGVs c2UgaWYgKHJlY29yZF9saXN0LT50eXBlID09IHJlY29yZF9tZW0pCiAJICAg IHsKIAkgICAgICAvKiBtZW0gKi8KLQkgICAgICBnZGJfYnl0ZSAqbWVtID0g YWxsb2NhIChyZWNvcmRfbGlzdC0+dS5tZW0ubGVuKTsKLQkgICAgICBpZiAo cmVjb3JkX2RlYnVnID4gMSkKLQkJZnByaW50Zl91bmZpbHRlcmVkIChnZGJf c3RkbG9nLAotCQkJCSAgICAiUHJvY2VzcyByZWNvcmQ6IHJlY29yZF9tZW0g JXMgdG8gIgotCQkJCSAgICAiaW5mZXJpb3IgYWRkciA9ICVzIGxlbiA9ICVk LlxuIiwKLQkJCQkgICAgaG9zdF9hZGRyZXNzX3RvX3N0cmluZyAocmVjb3Jk X2xpc3QpLAotCQkJCSAgICBwYWRkcmVzcyAoZ2RiYXJjaCwgcmVjb3JkX2xp c3QtPnUubWVtLmFkZHIpLAotCQkJCSAgICByZWNvcmRfbGlzdC0+dS5tZW0u bGVuKTsKLQotCSAgICAgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkKLQkJICAo cmVjb3JkX2xpc3QtPnUubWVtLmFkZHIsIG1lbSwgcmVjb3JkX2xpc3QtPnUu bWVtLmxlbikpCi0JCWVycm9yIChfKCJQcm9jZXNzIHJlY29yZDogZXJyb3Ig cmVhZGluZyBtZW1vcnkgYXQgIgotCQkJICJhZGRyID0gJXMgbGVuID0gJWQu IiksCi0JCSAgICAgICBwYWRkcmVzcyAoZ2RiYXJjaCwgcmVjb3JkX2xpc3Qt PnUubWVtLmFkZHIpLAotCQkgICAgICAgcmVjb3JkX2xpc3QtPnUubWVtLmxl bik7Ci0KLQkgICAgICBpZiAodGFyZ2V0X3dyaXRlX21lbW9yeQotCQkgIChy ZWNvcmRfbGlzdC0+dS5tZW0uYWRkciwgcmVjb3JkX2xpc3QtPnUubWVtLnZh bCwKLQkJICAgcmVjb3JkX2xpc3QtPnUubWVtLmxlbikpCi0JCWVycm9yIChf Ci0JCSAgICAgICAoIlByb2Nlc3MgcmVjb3JkOiBlcnJvciB3cml0aW5nIG1l bW9yeSBhdCAiCi0JCQkiYWRkciA9ICVzIGxlbiA9ICVkLiIpLAotCQkgICAg ICAgcGFkZHJlc3MgKGdkYmFyY2gsIHJlY29yZF9saXN0LT51Lm1lbS5hZGRy KSwKLQkJICAgICAgIHJlY29yZF9saXN0LT51Lm1lbS5sZW4pOworCSAgICAg IGlmIChyZWNvcmRfbGlzdC0+dS5tZW0ubm90X3JlcGxheQorCQkgICYmIGV4 ZWN1dGlvbl9kaXJlY3Rpb24gIT0gRVhFQ19SRVZFUlNFKQorCQlyZWNvcmRf bGlzdC0+dS5tZW0ubm90X3JlcGxheSA9IDA7CisJICAgICAgZWxzZQorCQl7 CisJCSAgZ2RiX2J5dGUgKm1lbSA9IGFsbG9jYSAocmVjb3JkX2xpc3QtPnUu bWVtLmxlbik7CisJCSAgaWYgKHJlY29yZF9kZWJ1ZyA+IDEpCisJCSAgICBm cHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csCisJCQkJICAgICAgICAi UHJvY2VzcyByZWNvcmQ6IHJlY29yZF9tZW0gJXMgdG8gIgorCQkJCSAgICAg ICAgImluZmVyaW9yIGFkZHIgPSAlcyBsZW4gPSAlZC5cbiIsCisJCQkJICAg ICAgICBob3N0X2FkZHJlc3NfdG9fc3RyaW5nIChyZWNvcmRfbGlzdCksCisJ CQkJICAgICAgICBwYWRkcmVzcyAoZ2RiYXJjaCwKKwkJCQkJICAgICAgICAg IHJlY29yZF9saXN0LT51Lm1lbS5hZGRyKSwKKwkJCQkgICAgICAgIHJlY29y ZF9saXN0LT51Lm1lbS5sZW4pOwogCi0JICAgICAgbWVtY3B5IChyZWNvcmRf bGlzdC0+dS5tZW0udmFsLCBtZW0sIHJlY29yZF9saXN0LT51Lm1lbS5sZW4p OworCQkgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkgKHJlY29yZF9saXN0LT51 Lm1lbS5hZGRyLCBtZW0sCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAg cmVjb3JkX2xpc3QtPnUubWVtLmxlbikpCisJICAgICAgICAgICAgeworCQkg ICAgICBpZiAoZXhlY3V0aW9uX2RpcmVjdGlvbiAhPSBFWEVDX1JFVkVSU0Up CisJCSAgICAgICAgZXJyb3IgKF8oIlByb2Nlc3MgcmVjb3JkOiBlcnJvciBy ZWFkaW5nIG1lbW9yeSBhdCAiCisJCQkgICAgICAgICAiYWRkciA9ICVzIGxl biA9ICVkLiIpLAorCQkgICAgICAgICAgICAgICBwYWRkcmVzcyAoZ2RiYXJj aCwgcmVjb3JkX2xpc3QtPnUubWVtLmFkZHIpLAorCQkgICAgICAgICAgICAg ICByZWNvcmRfbGlzdC0+dS5tZW0ubGVuKTsKKwkJICAgICAgZWxzZQorCQkg ICAgICAgIHJlY29yZF9saXN0LT51Lm1lbS5ub3RfcmVwbGF5ID0gMTsKKwkJ ICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGlmICh0YXJnZXRf d3JpdGVfbWVtb3J5IChyZWNvcmRfbGlzdC0+dS5tZW0uYWRkciwKKwkJCSAg ICAgICAgICAgICAgICAgICAgICAgcmVjb3JkX2xpc3QtPnUubWVtLnZhbCwK KwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZF9saXN0 LT51Lm1lbS5sZW4pKQorCSAgICAgICAgICAgICAgICB7CisJCQkgIGlmIChl eGVjdXRpb25fZGlyZWN0aW9uICE9IEVYRUNfUkVWRVJTRSkKKwkJCSAgICBl cnJvciAoXygiUHJvY2VzcyByZWNvcmQ6IGVycm9yIHdyaXRpbmcgbWVtb3J5 IGF0ICIKKwkJCSAgICAgICAgICAgICAiYWRkciA9ICVzIGxlbiA9ICVkLiIp LAorCQkgICAgICAgICAgICAgICAgICAgcGFkZHJlc3MgKGdkYmFyY2gsIHJl Y29yZF9saXN0LT51Lm1lbS5hZGRyKSwKKwkJICAgICAgICAgICAgICAgICAg IHJlY29yZF9saXN0LT51Lm1lbS5sZW4pOworCQkJICBlbHNlCisJCQkgICAg eworCQkJICAgICAgcmVjb3JkX2xpc3QtPnUubWVtLm5vdF9yZXBsYXkgPSAx OworCQkJICAgIH0KKwkJCX0KKwkJICAgICAgZWxzZQorCQkgICAgICAgIHsK KwkJCSAgbWVtY3B5IChyZWNvcmRfbGlzdC0+dS5tZW0udmFsLCBtZW0sCisJ CQkJICByZWNvcmRfbGlzdC0+dS5tZW0ubGVuKTsKKwkJCX0KKwkJICAgIH0K KwkJfQogCSAgICB9CiAJICBlbHNlCiAJICAgIHsK --000e0cd28d4a76c810046f32f742--