* Makefile.in (CYGWIN_BINS): Add pldd.
(pldd.exe): Add -lpsapi to ALL_LDFLAGS. * pldd.c: New file. * utils.sgml (pldd): New section.
This commit is contained in:
parent
e3ed49775e
commit
e2bf82d361
|
@ -53,7 +53,7 @@ MINGW_CXX := ${srcdir}/mingw ${CXX} -I${updir}
|
|||
# List all binaries to be linked in Cygwin mode. Each binary on this list
|
||||
# must have a corresponding .o of the same name.
|
||||
CYGWIN_BINS := ${addsuffix .exe,cygpath getconf getfacl ldd locale kill mkgroup \
|
||||
mkpasswd mount passwd ps regtool setfacl setmetamode ssp tzset umount}
|
||||
mkpasswd mount passwd pldd ps regtool setfacl setmetamode ssp tzset umount}
|
||||
|
||||
# List all binaries to be linked in MinGW mode. Each binary on this list
|
||||
# must have a corresponding .o of the same name.
|
||||
|
@ -81,6 +81,7 @@ ps.exe: ALL_LDFLAGS += -lcygwin -lpsapi -lntdll
|
|||
strace.exe: MINGW_LDFLAGS += -lntdll
|
||||
|
||||
ldd.exe: ALL_LDFLAGS += -lpsapi
|
||||
pldd.exe: ALL_LDFLAGS += -lpsapi
|
||||
|
||||
ldh.exe: MINGW_LDLIBS :=
|
||||
ldh.exe: MINGW_LDFLAGS := -nostdlib -lkernel32
|
||||
|
|
|
@ -0,0 +1,145 @@
|
|||
/* pldd.cc
|
||||
|
||||
Copyright 2012 Red Hat, Inc.
|
||||
|
||||
This file is part of Cygwin.
|
||||
|
||||
This software is a copyrighted work licensed under the terms of the
|
||||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||
details. */
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#define UNICODE
|
||||
#include <errno.h>
|
||||
#include <error.h>
|
||||
#include <getopt.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/cygwin.h>
|
||||
#include <cygwin/version.h>
|
||||
#include <windows.h>
|
||||
#include <psapi.h>
|
||||
|
||||
struct option longopts[] =
|
||||
{
|
||||
{"help", no_argument, NULL, '?'},
|
||||
{"version", no_argument, NULL, 'V'},
|
||||
{"usage", no_argument, NULL, 0},
|
||||
{0, no_argument, NULL, 0}
|
||||
};
|
||||
const char *opts = "?V";
|
||||
|
||||
__attribute__((noreturn))
|
||||
static void
|
||||
print_help (void)
|
||||
{
|
||||
printf ("Usage: pldd [OPTION...] PID\n\n"
|
||||
"List dynamic shared objects loaded into a process.\n\n"
|
||||
" -?, --help Give this help list\n"
|
||||
" --usage Give a short usage message\n"
|
||||
" -V, --version Print program version\n");
|
||||
exit (EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
__attribute__((noreturn))
|
||||
static void
|
||||
print_usage (void)
|
||||
{
|
||||
printf ("Usage: pldd [-?V] [--help] [--usage] [--version] PID\n");
|
||||
exit (EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
__attribute__((noreturn))
|
||||
static void
|
||||
print_version ()
|
||||
{
|
||||
printf ("pldd (cygwin) %d.%d.%d\n"
|
||||
"List dynamic shared objects loaded into process.\n"
|
||||
"Copyright (C) 2012 Red Hat, Inc.\n\n"
|
||||
"This program comes with NO WARRANTY, to the extent permitted by law.\n"
|
||||
"You may redistribute copies of this program under the terms of\n"
|
||||
"the Cygwin license. Please consult the CYGWIN_LICENSE file for details.\n",
|
||||
CYGWIN_VERSION_DLL_MAJOR / 1000,
|
||||
CYGWIN_VERSION_DLL_MAJOR % 1000,
|
||||
CYGWIN_VERSION_DLL_MINOR);
|
||||
exit (EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
__attribute__((noreturn))
|
||||
static void
|
||||
print_nargs (void)
|
||||
{
|
||||
fprintf (stderr, "Exactly one parameter with process ID required.\n"
|
||||
"Try `pldd --help' or `pldd --usage' for more information.\n");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
int optch, pid, winpid, i;
|
||||
char *pidfile, *exefile, *exename;
|
||||
FILE *fd;
|
||||
HANDLE hProcess;
|
||||
HMODULE hModules[1024];
|
||||
DWORD cbModules;
|
||||
|
||||
while ((optch = getopt_long (argc, argv, opts, longopts, &optind)) != -1)
|
||||
switch (optch)
|
||||
{
|
||||
case '?':
|
||||
print_help ();
|
||||
break;
|
||||
case 'V':
|
||||
print_version ();
|
||||
break;
|
||||
case 0:
|
||||
if (strcmp( "usage", longopts[optind].name ) == 0)
|
||||
print_usage ();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
if (argc != 1)
|
||||
print_nargs ();
|
||||
|
||||
pid = atoi (argv[0]);
|
||||
|
||||
if ((pid == 0))
|
||||
error (1, 0, "invalid process ID '%s'", argv[0]);
|
||||
|
||||
pidfile = (char *) malloc (32);
|
||||
sprintf(pidfile, "/proc/%d/winpid", pid);
|
||||
fd = fopen (pidfile, "rb");
|
||||
if (!fd)
|
||||
error (1, ENOENT, "cannot open /proc/%d", pid);
|
||||
fscanf (fd, "%d", &winpid);
|
||||
|
||||
exefile = (char *) malloc (32);
|
||||
exename = (char *) malloc (MAX_PATH);
|
||||
sprintf(exefile, "/proc/%d/exename", pid);
|
||||
fd = fopen (exefile, "rb");
|
||||
fscanf (fd, "%s", exename);
|
||||
|
||||
hProcess = OpenProcess (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, winpid);
|
||||
if (!hProcess)
|
||||
error (1, EPERM, "cannot attach to process %d", pid);
|
||||
|
||||
printf ("%d:\t%s\n", pid, exename);
|
||||
|
||||
EnumProcessModules (hProcess, hModules, sizeof(hModules), &cbModules);
|
||||
/* start at 1 to skip the executable itself */
|
||||
for (i = 1; i < (cbModules / sizeof(HMODULE)); i++)
|
||||
{
|
||||
TCHAR winname[MAX_PATH];
|
||||
char posixname[MAX_PATH];
|
||||
GetModuleFileNameEx (hProcess, hModules[i], winname, MAX_PATH);
|
||||
cygwin_conv_path (CCP_WIN_W_TO_POSIX, winname, posixname, MAX_PATH);
|
||||
printf ("%s\n", posixname);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1434,6 +1434,23 @@ some systems.</para>
|
|||
|
||||
</sect2>
|
||||
|
||||
<sect2 id="pldd"><title>pldd</title>
|
||||
|
||||
<screen>
|
||||
Usage: pldd [OPTION...] PID
|
||||
|
||||
List dynamic shared objects loaded into a process.
|
||||
|
||||
-?, --help Give this help list
|
||||
--usage Give a short usage message
|
||||
-V, --version Print program version
|
||||
</screen>
|
||||
|
||||
<para><command>pldd</command> prints the shared libraries (DLLs) loaded
|
||||
by the process with the given PID.</para>
|
||||
|
||||
</sect2>
|
||||
|
||||
<sect2 id="ps"><title>ps</title>
|
||||
|
||||
<screen>
|
||||
|
|
Loading…
Reference in New Issue