GVKun编程网logo

如何在sys.settrace中打印函数参数?(syso打印)

16

本文将带您了解关于如何在sys.settrace中打印函数参数?的新内容,同时我们还将为您解释syso打印的相关知识,另外,我们还将为您提供关于Android开发中如何在Service中打开设备管理器

本文将带您了解关于如何在sys.settrace中打印函数参数?的新内容,同时我们还将为您解释syso打印的相关知识,另外,我们还将为您提供关于Android开发中如何在Service中打开设备管理器、c – GDB:如果没有可用的名称符号,如何打印函数参数值、c – 创建一个打印函数,该函数将ostream作为参数并写入该流、C++ 函数的定义中如何指定函数参数?的实用信息。

本文目录一览:

如何在sys.settrace中打印函数参数?(syso打印)

如何在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", "!")

要实现的关键是

  1. 我们可以看到框架中的所有局部变量为f_locals
  2. 我们可以从中提取参数列表中变量的名称f_code.co_varnames

Android开发中如何在Service中打开设备管理器

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:如果没有可用的名称符号,如何打印函数参数值

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作为参数并写入该流

c – 创建一个打印函数,该函数将ostream作为参数并写入该流

我目前正在讨论有关C中运算符重载的问题.我有个问题:

创建一个包含int的简单类,并将运算符作为成员函数重载.还提供了一个print()成员函数,它具有一个ostream和amp;作为一个论点并打印到那个ostream&amp ;.测试你的课程,以证明它正常工作.

我可以创建类并编写运算符函数,但我真的不明白问题的第二部分.到目前为止,在我对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, ...)例如,计算两个数字总和的函数:int sum(int num1, int num2) { return num1 + num2; }实战案例:计算数组 arr 中最大值:int findmax(int arr[], int size) { ... }

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++ 函数的定义中如何指定函数参数?的相关信息,可以在本站进行搜索。

本文标签: