本文将带您了解关于如何在sys.settrace中打印函数参数?的新内容,同时我们还将为您解释syso打印的相关知识,另外,我们还将为您提供关于Android开发中如何在Service中打开设备管理器
本文将带您了解关于如何在sys.settrace中打印函数参数?的新内容,同时我们还将为您解释syso打印的相关知识,另外,我们还将为您提供关于Android开发中如何在Service中打开设备管理器、c – GDB:如果没有可用的名称符号,如何打印函数参数值、c – 创建一个打印函数,该函数将ostream作为参数并写入该流、C++ 函数的定义中如何指定函数参数?的实用信息。
本文目录一览:- 如何在sys.settrace中打印函数参数?(syso打印)
- Android开发中如何在Service中打开设备管理器
- c – GDB:如果没有可用的名称符号,如何打印函数参数值
- c – 创建一个打印函数,该函数将ostream作为参数并写入该流
- C++ 函数的定义中如何指定函数参数?
如何在sys.settrace中打印函数参数?(syso打印)
如何检查sys.settrace调用中的函数参数的值?似乎我有可能输出除参数以外的几乎所有内容(行,文件名,堆栈跟踪,返回值等)。有没有可以让我跟踪函数参数值的解决方法?
答案1
小编典典您可以结合使用代码对象和框架对象。
请参阅《Python数据模型参考》中有关这些内容的描述。
import sysdef fn(frame, msg, arg): if msg != ''call'': return # Filter as appropriate if frame.f_code.co_filename.startswith("/usr"): return print("Called", frame.f_code.co_name) for i in range(frame.f_code.co_argcount): name = frame.f_code.co_varnames[i] print(" Argument", name, "is", frame.f_locals[name])sys.settrace(fn)def hai(a, b, c): print(a, b, c)hai("Hallo", "Welt", "!")
要实现的关键是
- 我们可以看到框架中的所有局部变量为
f_locals
。 - 我们可以从中提取参数列表中变量的名称
f_code.co_varnames
。
Android开发中如何在Service中打开设备管理器
我想在Service中打开设备管理器Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "打开设备管理器");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
这会是没有报错了,但是就是没有效果.
代码也执行了,但是就是没有跳转到"激活设备管理"界面.
如果不加intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 这条语句就会报错:
android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
上面这段代码如果放在Activity中的话,则可以正常工作(前提是要将intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);注释掉).
c – GDB:如果没有可用的名称符号,如何打印函数参数值
(gdb) frame 7 #7 0x00007f201a269e82 in f1(std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned char*,int,std::basic_string<char,std::allocator<char> >*) () from /usr/lib64/libsome.so (gdb) info args No symbol table info available. (gdb) info f Stack level 7,frame at 0x7f200ebf9e50: rip = 0x7f201a269e82 in f1(std::basic_string<char,std::allocator<char> >*); saved rip 0x7f201b430905 called by frame at 0x7f200ebfa1c0,caller of frame at 0x7f200ebf9e00 Arglist at 0x7f200ebf9df8,args: Locals at 0x7f200ebf9df8,PrevIoUs frame's sp is 0x7f200ebf9e50 Saved registers: rbx at 0x7f200ebf9e28,rbp at 0x7f200ebf9e30,r12 at 0x7f200ebf9e38,r13 at 0x7f200ebf9e40,rip at 0x7f200ebf9e48
具体来说,我需要知道第一个参数(std :: string)和最后一个参数(std :: string *)中的内容.
此框架中的arglist和locals都指向相同的地址……
解决方法
您需要做的是查找适用于您的平台的ABI,然后使用它来了解参数传递约定.这并不总是那么容易,但可以做到.这将告诉您如何查找参数,无论它们是在寄存器还是内存中;然后你可以使用强制转换为适当的类型来打印它们.
当然,如果你没有debuginfo,那么转换也可能很困难.虽然有一个技巧:使用-g编译一个具有所需类型的虚拟文件,然后将其符号文件转换为gdb以访问类型.这当然有警告,你必须使用正确的编译器和库版本,正确的编译器目标和ABI更改标志等.
提前计划并且总是在某处调试信息真的好多了.这对你现在没有帮助,但将来可能会有所帮助.能够发送程序但保持调试信息可用于以后基本上是拆分debuginfo被发明的原因.
此外,值得注意的是gdb帧输出自stabs天以来没有太大变化,这些天已经过去了.我认为“arglist”和“locals”信息对于DWARF和现代ABI来说确实毫无意义.有关于修复此问题的gdb错误.
c – 创建一个打印函数,该函数将ostream作为参数并写入该流
创建一个包含int的简单类,并将运算符作为成员函数重载.还提供了一个print()成员函数,它具有一个ostream和amp;作为一个论点并打印到那个ostream& ;.测试你的课程,以证明它正常工作.
我可以创建类并编写运算符函数,但我真的不明白问题的第二部分.到目前为止,在我对c的研究中,我并没有真正遇到过ostream,因此我不确定是否可以明确地创建这样的流.我尝试过使用:
std :: ostream o;
但是这会产生错误.有人可以请教我如何创建这个功能吗?
解决方法
So far in my study of c++ I havent really come across ostream’s and as
such am not sure if its possible to explicitly create such a stream. I
have tried using: std::ostream o;
你一定错过了什么,因为ostream很重要.顺便说一句,std :: cout是std :: ostream类型的变量.用法或多或少是这样的
#include <iostream> //defines "std::ostream",and creates "std::ofstream std::cout" #include <fstream> //defines "std::ofstream" (a type of std::ostream) std::ostream& doStuffWithStream(std::ostream &out) { //defines a function out << "apples!"; return out; } int main() { std::cout << "starting!\n"; doStuffWithStream(std::cout); //uses the function std::ofstream fileout("C:/myfile.txt"); //creates a "std::ofstream" doStuffWithStream(fileout); //uses the function return 0; }
C++ 函数的定义中如何指定函数参数?
C++ 函数参数定义详解
在 C++ 中,函数参数是在函数定义中指定的。函数参数位于函数名和函数体之间,由数据类型和参数名组成。
语法:
返回值类型 函数名(参数类型1 参数名1, 参数类型2 参数名2, ...) { // 函数体 }
例如,下面是一个计算两个数字总和的函数:
立即学习“C++免费学习笔记(深入)”;
int sum(int num1, int num2) { return num1 + num2; }
在这个函数中,int 指定了函数的返回值类型,num1 和 num2 是函数的参数,它们的类型都是 int。
实战案例:计算最大值
假设我们有一个数组 arr,包含一组整数,我们需要编写一个函数来找到其中的最大值。
int findMax(int arr[], int size) { int max = arr[0]; for (int i = 1; i < size; i++) { if (arr[i] > max) { max = arr[i]; } } return max; }
在这个函数中:
- int findMax(int arr[], int size) 定义了函数签名,其中 arr 是数组,size 是数组的大小。
- int max = arr[0]; 在数组的第一个元素中初始化 max 变量。
- for (int i = 1; i
- if (arr[i] > max) 检查当前元素是否大于 max。
- max = arr[i]; 如果当前元素大于 max,则将 max 更新为当前元素。
函数通过返回 max 值来计算最大值。
以上就是C++ 函数的定义中如何指定函数参数?的详细内容,更多请关注php中文网其它相关文章!
我们今天的关于如何在sys.settrace中打印函数参数?和syso打印的分享就到这里,谢谢您的阅读,如果想了解更多关于Android开发中如何在Service中打开设备管理器、c – GDB:如果没有可用的名称符号,如何打印函数参数值、c – 创建一个打印函数,该函数将ostream作为参数并写入该流、C++ 函数的定义中如何指定函数参数?的相关信息,可以在本站进行搜索。
本文标签: