我目前正在尝试分析一个大型复杂函数的行为,它接受了大量的指针输入。请考虑以下签名。
int myfunc(typeA *paramA, typeB *paramB);
被调用为
myfunc(argA, argB);
如果写入argA
和argB
的指针位置,是否可以使用调试器进行监听?或者是否只能观察内存位置是否发生了变化(在我的情况下肯定不会发生)?
我想在函数调用之前和之后检查这些指针参数的区别。这块表可以吗?
请注意,传递的这些类/结构很大,有其他指向类/结构的指针。因此,逐个观察每个变量将是我的最后手段
答案 0 :(得分:0)
由于您已使用CLion标记了自己的帖子,我认为这是您正在使用的IDE。您可能想阅读这篇文章: https://blog.jetbrains.com/clion/2015/05/debug-clion/
特别是关于手表的部分:
在每个单点捕获每个变量会导致太多信息。有时,您希望关注特定变量及其在整个程序执行过程中的变化方式,包括在有问题的变量不是您正在检查的代码的本地变量时监视更改。这是Debug工具窗口的Watch区域的用途。
要开始观看变量,只需按添加按钮(Alt + Insert(Windows / Linux)/⌘N(OS X))并输入要观看的变量的名称。代码完成也可以在这里找到。
根据你的评论: 您可以选择查看内存的写入时间:Can I set a breakpoint on 'memory access' in GDB?
否则,如果您只是想知道是否更改了调试值,只需在调用函数之前复制该值:
typeA copyOfA = *argA;
myfunc(©OfA, argB);
if (copyOfA != *argA)
{
// It's changed
}
答案 1 :(得分:0)
我不确定我是否正确地提出了您的问题,而且我不知道clion是否允许您访问lldb脚本解释器,但是给出了这个示例:
struct Foo
{
int a;
int b;
int c;
};
void ChangeFoo(struct Foo *input)
{
input->a += 10;
}
int
main()
{
struct Foo my_foo = {10, 20, 30};
ChangeFoo(&my_foo);
return 0;
}
从命令行lldb 你可以这样做:
(lldb) br s -l 17
Breakpoint 1: where = tryme`main + 39 at tryme.c:17, address = 0x0000000100000f97
(lldb) br s -l 18
Breakpoint 2: where = tryme`main + 46 at tryme.c:18, address = 0x0000000100000f9e
(lldb) run
Process 16017 launched: '/tmp/tryme' (x86_64)
Process 16017 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x0000000100000f97 tryme`main at tryme.c:17
14 main()
15 {
16 struct Foo my_foo = {10, 20, 30};
-> 17 ChangeFoo(&my_foo);
^
18 return 0;
19 }
Target 0: (tryme) stopped.
(lldb) script value = lldb.frame.FindVariable("my_foo")
(lldb) script print value
(Foo) my_foo = {
a = 10
b = 20
c = 30
}
(lldb) n
Process 16017 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
frame #0: 0x0000000100000f9e tryme`main at tryme.c:18
15 {
16 struct Foo my_foo = {10, 20, 30};
17 ChangeFoo(&my_foo);
-> 18 return 0;
^
19 }
Target 0: (tryme) stopped.
(lldb) script
Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D.
>>> for i in range(0,value.GetNumChildren()):
... print(i, " ", value.GetChildAtIndex(i).GetValueDidChange())
...
(0, ' ', True)
(1, ' ', False)
(2, ' ', False)
>>> print value.GetChildAtIndex(0)
(int) a = 20
注意,如果上面的my_foo
是指针,我们只会获取指针值而不是你想要比较的值。在这种情况下,当您捕获值时:
(lldb)script value = lldb.frame.FindVariable(“my_foo_ptr”)。Dereference()
你最初得到的价值,然后一切都会如上所述。