如何不通过输出Log,判断某个程序运行到哪个函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何不通过输出Log,判断某个程序运行到哪个函数?相关的知识,希望对你有一定的参考价值。

不能打断点,必须程序一直运行着,并且无法在源代码里加Log
只要给出可行思路就行
能有啥方法实时监听程序某个线程,运行到哪个函数吗

程序调试除了可以设置断点,你还可以通过attach方式来调试程序,通过附加进程id的方式,可以在gdb中打印堆栈信息。
gdb调试正在运行的程序
1、ps aux | grep mxx.exe
查找可执行程序的进程id
2、gdb attach pid
attach可执行程序的进程pid
3、continue/c 或者continue or c
当attach进程时,会停止进程的运行,这时使进程继续运行需要使用continue/c命令
4、其他gdb操作(bt b watch etc..)
现在可以使用其他gdb命令来调试了
参考技术A getcher函数与getch函数作用相同,也是从键盘只接受一个字符,也不用按下回车键就返回到调用函数,但这个字符会被显示出来. 3,具体代码如下: #include<stdio.h> double 。 参考技术B 程序调试除了可以设置断点,你还可以通过attach方式来调试程序,通过附加进程id的方式,可以在gdb中打印堆栈信息。gdb调试正在运行的程序 1、ps aux | grep mxx.exe 查找可执行程序的进程id 2、gdb attach pid attach可执行... 参考技术C 估计你要看寻址寄存器位置和每个函数在代码段得位置来判断了,这个技术估计非常难以搞定,不一定值得你搞 参考技术D hook

探针

gdb

如何判断 openoffice 的哪个应用程序正在运行?

【中文标题】如何判断 openoffice 的哪个应用程序正在运行?【英文标题】:How can I tell which application of openoffice is running? 【发布时间】:2009-09-29 09:16:52 【问题描述】:

我想查看进程列表以确定 OpenOffice Calc 是否正在运行或 OpenOffice Writer 是否正在运行。关闭 QuickStart 后,我​​会得到一个 scalc.exe 和一个 swriter.exe,所以很简单。

但是,当快速启动启动时,我只得到 soffice.bin 和 soffice.exe

有没有办法询问这些进程正在运行哪个应用程序?

【问题讨论】:

【参考方案1】:

我认为没有办法检查窗口标题。您必须枚举所有窗口并检查标题是否以“-OpenOffice.org Writer”或“-OpenOffice.org Calc”等结尾。

以下简短示例将检查 Writer 是否正在运行:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;

namespace Sample

    public class Window
    
        public string Title  get; set; 
        public int Handle  get; set; 
        public string ProcessName  get; set; 
    

    public class WindowHelper
    
        /// <summary>
        /// Win32 API Imports
        /// </summary>
        [DllImport("user32.dll")]
        private static extern int GetWindowText(IntPtr hWnd, StringBuilder title, int size);
        [DllImport("user32.dll")]
        private static extern int EnumWindows(EnumWindowsProc ewp, int lParam);
        [DllImport("user32.dll")]
        private static extern bool IsWindowVisible(IntPtr hWnd);
        [DllImport("user32.dll", SetLastError = true)]
        static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

        public delegate bool EnumWindowsProc(IntPtr hWnd, int lParam);

        private List<Window> _openOfficeWindows;

        public List<Window> GetOpenOfficeWindows()
        
            _openOfficeWindows = new List<Window>();
            EnumWindowsProc ewp = new EnumWindowsProc(EvalWindow);
            EnumWindows(ewp, 0);

            return _openOfficeWindows;
        

        private bool EvalWindow(IntPtr hWnd, int lParam)
        
            if (!IsWindowVisible(hWnd))
                return (true);

            uint lpdwProcessId;
            StringBuilder title = new StringBuilder(256);

            GetWindowThreadProcessId(hWnd, out lpdwProcessId);
            GetWindowText(hWnd, title, 256);

            Process p = Process.GetProcessById((int)lpdwProcessId);
            if (p != null && p.ProcessName.ToLower().Contains("soffice"))
            
                _openOfficeWindows.Add(new Window()  Title = title.ToString(), Handle = hWnd.ToInt32(), ProcessName = p.ProcessName );
            

            return (true);
        
    
    class Program
    
        static void Main(string[] args)
        
            WindowHelper helper = new WindowHelper();

            List<Window> openOfficeWindows = helper.GetOpenOfficeWindows();

            foreach (var item in openOfficeWindows)
            
                if (item.Title.EndsWith("- OpenOffice.org Writer"))
                
                    Console.WriteLine("Writer is running");
                
            
        
    

【讨论】:

以上是关于如何不通过输出Log,判断某个程序运行到哪个函数?的主要内容,如果未能解决你的问题,请参考以下文章

c语言如何调用网页上某个功能

怎么用ABAP 代码判断,,某程序的某个屏幕上,输出了 ALV 且 计算 输出ALV 的内表有 多少个字段?

Python笔记:Python装饰器

一个测试程序迭代的故事05

如何将警告和错误保存为函数的输出?

利用logback+slf4j日志采集整合到SBA