diff options
author | Johnny Chen <johnny.chen@apple.com> | 2011-09-30 01:08:48 +0000 |
---|---|---|
committer | Johnny Chen <johnny.chen@apple.com> | 2011-09-30 01:08:48 +0000 |
commit | b62a3be1a23277de16a30636a021374b03532cce (patch) | |
tree | eae8f97db9bda34ebe9f65dc7264b80518d479ca /lldb/source/Commands/CommandObjectFrame.cpp | |
parent | 2af4db5835d41d545f80bcfbd94e7ff6dad381b6 (diff) | |
download | bcm5719-llvm-b62a3be1a23277de16a30636a021374b03532cce.tar.gz bcm5719-llvm-b62a3be1a23277de16a30636a021374b03532cce.zip |
Add an accompanying option to the 'frame variable -w' command to, instead of watching the variable,
watch the location pointed to by the variable. An example,
(lldb) frame variable -w write -x 1 -g g_char_ptr
(char *) g_char_ptr = 0x0000000100100860 ""...
Watchpoint created: WatchpointLocation 1: addr = 0x100100860 size = 1 state = enabled type = w
declare @ '/Volumes/data/lldb/svn/trunk/test/functionalities/watchpoint/hello_watchlocation/main.cpp:21'
...
(lldb) c
Process 3936 resuming
...
rocess 3936 stopped
* thread #2: tid = 0x3403, 0x00000001000009b7 a.out`do_bad_thing_with_location(char*, char) + 23 at main.cpp:27, stop reason = watchpoint 1
frame #0: 0x00000001000009b7 a.out`do_bad_thing_with_location(char*, char) + 23 at main.cpp:27
24 do_bad_thing_with_location(char *char_ptr, char new_val)
25 {
26 *char_ptr = new_val;
-> 27 }
28
29 uint32_t access_pool (uint32_t flag = 0);
30
(lldb)
Also add TestWatchLocation.py test to exercise this functionality.
llvm-svn: 140836
Diffstat (limited to 'lldb/source/Commands/CommandObjectFrame.cpp')
-rw-r--r-- | lldb/source/Commands/CommandObjectFrame.cpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/lldb/source/Commands/CommandObjectFrame.cpp b/lldb/source/Commands/CommandObjectFrame.cpp index 4790eef4cde..288a5ea1b7d 100644 --- a/lldb/source/Commands/CommandObjectFrame.cpp +++ b/lldb/source/Commands/CommandObjectFrame.cpp @@ -436,7 +436,7 @@ public: } // Things have checked out ok... - // m_option_watchpoint.watch_mode specifies the mode for watching. + // m_option_watchpoint.watch_type specifies the type of watching. } if (command.GetArgumentCount() > 0) { @@ -532,12 +532,20 @@ public: if (m_option_watchpoint.watch_variable) { AddressType addr_type; - lldb::addr_t addr = valobj_sp->GetAddressOf(false, &addr_type); + lldb::addr_t addr = 0; size_t size = 0; - if (addr_type == eAddressTypeLoad) { - // We're in business. - // Find out the size of this variable. - size = valobj_sp->GetByteSize(); + if (m_option_watchpoint.watch_size == 0) { + addr = valobj_sp->GetAddressOf(false, &addr_type); + if (addr_type == eAddressTypeLoad) { + // We're in business. + // Find out the size of this variable. + size = valobj_sp->GetByteSize(); + } + } else { + // The '-xsize'/'-x' option means to treat the value object as + // a pointer and to watch the pointee with the specified size. + addr = valobj_sp->GetValueAsUnsigned(0); + size = m_option_watchpoint.watch_size; } uint32_t watch_type = m_option_watchpoint.watch_type; WatchpointLocation *wp_loc = exe_ctx.GetTargetRef().CreateWatchpointLocation(addr, size, watch_type).get(); |